Skip to content

Instantly share code, notes, and snippets.

@onjiro
Last active August 29, 2015 14:05
Show Gist options
  • Save onjiro/0946f3292da08705b60a to your computer and use it in GitHub Desktop.
Save onjiro/0946f3292da08705b60a to your computer and use it in GitHub Desktop.
angular.module('colorsOptionDirective').directive('colorsOption', ['$compile', function($compile) {
var colors = ["red", "yellow", "blue"];
compile: function(element, attr) {
var optionTemplate = angular.element(document.createElement('option'));
for (var i = 0; i < colors.length; i++) {
$compile(optionTemplate.clone()
.val(colors[i])
.text(colors[i])
.appendTo(element));
}
}
}]);
@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

  • $timeout 必要なかった
  • ng-model と組み合わせた時に unknown option が生成されてしまう

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

priority を設定して、select より先に処理されるようにしてもダメだった。処理順の問題ではないのか。。。
https://docs.angularjs.org/api/ng/service/$compile#-priority-

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

一応できた。

  • select ディレクティブ側で、option の value 一覧を持っている
  • ng-model が設定されている場合、select ディレクティブ内で値を検索して selected を追加している
  • 一致する option がなければ空の option を追加する

select ディレクティブの option 一覧をどうやって設定しているか?

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

ただ、colors の値を操作する必要がある場合は$watchとかいれる必要があるかも。もうちょっと中身ちゃんと調べないと変なこと起きそう。。。
option と ng-model については select ディレクティブに密接に関わっているのでなかなかややこしい...

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

linkじゃなくて、compile時にoptionタグを生成したら、optionディレクティブ側でうまいことやってくれないかと思ったけど、うまくいかない模様。
生成したタグに対してはoptionディレクティブが効かないのか、効くけど処理が次回以降のループにまわってしまうのか...

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

生成したoptionタグに対してはoptionディレクティブのcompileは実行されないことを確認。
この挙動はng-optionsを利用した場合も同じく。

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

タグの生成なのでlinkではなくcompileを使ったほうがよいかも。
・・・と思ったけど、$selectControllerに依存してしまうので、link内で処理する必要がありました。
(compile時点では$selectControllerが生成されていない)

linkとcompileの使い分けについて
http://angularjsninja.com/blog/2013/11/22/angularjs-custom-directives/
(optionディレクティブのcompileが実行されないのはcompileの性質によるものでした。)

@onjiro
Copy link
Author

onjiro commented Aug 8, 2014

$compile使えば動的に生成したタグにcompileかけれる模様。
これで、optionタグ直書きの場合と同じ扱いにできるので、データが静的な場合は問題なさそう。

データを動的にする場合、$watchCollectionをかける必要があるので全く同じやり方ではできないので注意必要そう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment