AngularJS — куда это должно идти? Контроллер или ссылка?

#javascript #angularjs

#javascript #angularjs

Вопрос:

Мне нужно вызвать $compile в моей директиве. Большинство примеров, в которых говорится о манипулировании DOM, говорят, что это должно быть сделано в функции link .

Но если я смотрю свойство модели, то, конечно, я могу использовать ng-change и обработать это в контроллере? Оба работают в любом случае.

Директива HTML шаблон:

<div>
<div>
<select ng-model="myProperty" ng-change="onChange()">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
</div>
<div id="toBeReplaced"></div>
</div>

Директива JS:

 angular.module('myApp')
.directive('myDirective', ['$compile', function ($compile) {
    var markup = '<div>{{ property }}</div>';

    return {
        templateUrl: '/views/template.html',
        restrict: 'A',
        controller: function($scope, $element, $attrs){
            // other controller code that I need.


            $scope.onChange = function(){
                $element.find("#toBeReplaced").html(markup);

                $compile($element.contents())($scope);
            };
        },
        link: function(scope, element, attrs) {
            scope.$watch('myProperty', function(newVal, oldVal){
                if(oldVal !== newVal) {
                    element.find("#toBeReplaced").html(markup);

                    $compile(element.contents())(scope);
                }
            });
        }
    };
}]);
  

Есть ли какая-либо причина не использовать решение контроллера?

Комментарии:

1. Согласно документации angular, используйте controller только в том случае, если вы хотите взаимодействовать с этой директивой из другой директивы

2. И не могли бы вы избежать всей этой привязки html, подобной jQuery, просто с помощью ng-bind-html ? Кроме того, вы $element.find не будете работать с jqlite, поскольку jqlite находит только по имени тега .

3. @Ahmad Я прочитал это, но это кажется ограниченным. Если директива имеет собственную область действия, должен ли я использовать для нее контроллер для настройки его свойств и методов модели?

4. @DominikSchreiber Спасибо. Я просто очень быстро это понял. Получение элементов ни здесь, ни там для моего вопроса :). Не могли бы вы указать мне на что-нибудь полезное для ng-bind-html? Мне было интересно, как я мог бы его включить.

5. @AlexB, нет, в этом нет необходимости, переменная области видимости представляет вашу модель в представлении