Директивы AngularJS связывают порядок выполнения функции с требованием

0

Я смотрел это видео, и у меня есть вопрос, на который я не могу найти ответ. Существует плункер http://plnkr.co/edit/L8OMoB?p=preview

HTML

<div ng-app="app">
            <div ng-controller="MyCtrl">
                <my-select-view on="color">
                    <my-view label="Red" value="red"><span class="red-text">Red Content</span></my-view>
                    <my-view label="Blue" value="blue"><span class="blue-text">Blue Content</span></my-view>
                    <my-view label="Green" value="green"><span class="green-text">Green Content</span></my-view>
                    <my-view label="Something" value="something"><span class="something-text">Something Content</span></my-view>
                </my-select-view>
            </div>
        </div>

JS

angular.module('app', ['ngSanitize'])
        .directive("mySelectView", function($compile) {

            return {
                restrict: "E",
                scope: { item : "=on"},
                controller: function($scope, $element) {
                    $scope.views = [];

                    this.addView = function(label, value, content) {
                        $scope.views.push({ label: label, value: value, content: content });
                    }

                },
                link: function(scope, element, attrs, ctrl) {
                    var selectTpl = "<select ng-model='item'" +
                                    "        ng-options='view.value as view.label for view in views'" +
                                    "        ng-change='changeView()'></select>";

                    ...

                }
            }
        })
        .directive("myView", function() {
            return {
                restrict: "E",
                require: "^mySelectView",
                link: function(scope, element, attrs, ctrl) {
                    ctrl.addView(attrs.label, attrs.value, element.html());
                }
            };
        })
        .controller("MyCtrl", function($scope) {
            $scope.color = "something";
        });

Я хотел бы знать одно. Мы получили директиву "mySelectView", который содержит функцию "ссылка". Эта функция "ссылка" зависит от переменной "views", которая должна быть определена и содержать что-то.

Единственный способ получить его - вызвать функцию "ссылка" на другую директиву "myView". Эта директива имеет параметр require для предыдущей директивы.

Поэтому мой вопрос: как "ссылка" функция директивы "mySelectView" выполняется после функции "link" директивы "myView". Я предполагаю это из-за атрибута "ng-option", которому требуется $ scope.views, чтобы правильно отображать вещи. Это означает, что функция соединения "myView" выполняется и добавляет представления.

Но как? Кто решает этот порядок? Почему "ссылка" функции первой директивы просто не сработает неудачно из-за неопределенных $ scope.views?

Любая помощь будет оценена!

Теги:

1 ответ

1
Лучший ответ

Ваши $scope.views не определены. Напротив, он был инициализирован пустым массивом $scope.views = [];

Я надеюсь, что эта ссылка ответит на ваши вопросы о порядке выполнения функций ссылок

  • 0
    Спасибо за ссылку - я сделаю свое исследование

Ещё вопросы

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