Перевожу свой проект на Angular.js, и так как дизайн требует нестандартных элементов - используются плагины. Один из них - это
Selecter, для стилизации вида выпадающего меню.
Так вот, пишу директиву под это дело, получилось вот так:
app.directive("select", ['$timeout', function (timer) {
return {
restrict: "E",
link: function(scope, element, attrs) {
apply = function () {
console.log('установили обработчик');
$(element).selecter('destroy').selecter({
customClass: attrs.color
});
}
init = function () {
apply();
if (attrs.selecterScope) {
console.log('Установили ватч');
scope.$watch(attrs.selecterScope, function () {
console.log('рефрешнули это дело');
timer(apply, 0);
});
}
}
timer(init, 0);
}
};
}]);
Таймер нужен, что бы данные сначала отрендерились в:
<select ng-model="sVersion" color="green" ng-options="c for c in versions" selecter-scope="versions">
<option value="">Выберите версию</option>
</select>
А только за тем был применён плагин.
Ошибка заключается в том, что $watch ведёт себя совершенно непонятно. Во-первых, он сразу же срабатывает в момент установки, независимо от того, изменились ли данные или нет. Во-вторых, он не отлавливает дальнейшие изменения переменной.
В переменной хранится обычный массив вида:
scope.versions = ["1.7.4", "1.7.2", "1.6.4", "1.5.2", "1.4.7"];