Зачем нам нужна функция ссылки Angular

0

Я много искал и читал, но все еще смущен.

Вопрос в том, есть ли у меня директива, как показано ниже

.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".

Можете ли вы привести пример, где мы должны использовать ссылку, а не контроллер, и какая разница.

Показать ещё 1 комментарий
Теги:
angularjs-directive

2 ответа

1

Короткий ответ:

Директива DOM не отображается при инициализации контроллера. Если вы хотите настроить слушателей ("$ watch"), вам нужна функция ссылки, которая выполняется после рендеринга DOM.

Длинный ответ: https://docs.angularjs.org/api/ng/service/$compile

0

У меня не было случая использовать функции 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
   }
   ...
]);
  • 0
    вопрос в том, что вы могли бы поместить все это в контроллер, и все было бы хорошо .. так почему бы и нет
  • 0
    Контроллеры никогда не должны использоваться для манипулирования DOM. Смотрите здесь для веской причины, почему stackoverflow.com/questions/28988547/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню