Я много искал и читал, но все еще смущен.
Вопрос в том, есть ли у меня директива, как показано ниже
.directive('someDirective',function(){
return{
scope:{},
bindToController:{
prop:"="
},
templateUrl:'myTemplate.html',
controller:'directiveController'
}
})
.controller('directiveController',function(){
//Do controller stuff
})
Зачем мне нужна функция ссылки? Я могу в значительной степени привязать всю DOM к контроллеру для передачи данных. (Да, я знаю, что контроллеры должны использоваться, когда мы хотим выставить функцию API в соответствии с угловыми документами). Предварительно угловой 1.2, когда bindToController не существовал, он все еще имеет смысл.
Я прочитал, что есть метод pre и post, вот где мы должны делать такие вещи, как добавление элементов и т.д. Но опять-таки я смущен, почему я добавляю материал, когда могу просто поместить его в "myTemplate.html".
Можете ли вы привести пример, где мы должны использовать ссылку, а не контроллер, и какая разница.
Короткий ответ:
Директива DOM не отображается при инициализации контроллера. Если вы хотите настроить слушателей ("$ watch"), вам нужна функция ссылки, которая выполняется после рендеринга DOM.
Длинный ответ: https://docs.angularjs.org/api/ng/service/$compile
У меня не было случая использовать функции pre- или пост-ссылки раньше, но мы все время используем функцию связи в нашей системе, чтобы получить конкретный экземпляр виджета, а затем с ней что-то сделать.
Один виджет, который у нас есть в нашей структуре, - это сетка. Внутри сетки мы предоставили пользователям возможность редактировать содержимое ячеек.
Пользователи нашей инфраструктуры могут добавить такой атрибут к своей разметке:
<sg-grid editable="true"></sg-grid>
Затем мы рассматриваем этот атрибут, используя параметр attrs в функции ссылки:
angular.module('sg.grid').directive('sgGrid', [
restrict: 'E', // this is an element directive
scope: {
editable: @editable // each grid has its own, isolated scope
},
template: '<div class="sg-grid" ng-click="someFunction()"></div>', // we also add behaviour to the widget using events that are added to scope in the link()
link: function (scope, elm, attrs, ctrls) {
if (!_.isUndefined(attrs.editable)) { // underscore.js is used to check if it is defined
if(attrs.editable === 'true' {
addEditFunctionalityToCell();
}
addEditFunctionalityToCell() {
...
}
}
scope.someFunction = function() { ... } // this is bound to ng-click in the template
}
...
]);