Как определить, когда свойство scope установлено в функции ссылки на директиву Angular?

#javascript #angularjs #angularjs-directive

#javascript #angularjs #angularjs-директива

Вопрос:

Я создаю директиву, которая должна инициализировать некоторые данные на основе значений, переданных в нее через область. Проблема в том, что когда я пытаюсь инициализировать данные в функции ссылки, переданное значение еще недоступно. Можно ли в любом случае запускать инициализацию только тогда, когда переданное значение доступно? Я думал об использовании watch, как в следующем коде, но это кажется беспорядочным (и, похоже, все равно не работает).

 .directive('etMemberActivitySummary', [function () {
    return {
        restrict: 'E',
        templateUrl: '<div>My template</div>',
        transclude: false,
        scope: {
            memberModel: '='
        },
        link: function(scope, element, attrs, controller) {
            var watcher = scope.$watch(
                function() {
                    return scope.memberModel
                },
                function(value) {
                    console.log(value);
                    if (value != null) {
                        console.log('Watch');
                        console.log(value);
                        watcher();
                        // Perform initialization based on scope.memberModel here
                    }
                });
        }
    }
}])
  

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

Обновление 1

Оказывается, что если я добавлю ng-if =»ctrl.memberModel» к использованию директивы, как показано ниже, и избавлюсь от всего, что нужно для просмотра, это сработает. Это лучший способ сделать это?

 <et-member-activity-summary member-model="ctrl.memberModel" ng-if="ctrl.memberModel"></et-member-activity-summary>
  

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

1. ng-if создает дочернюю область, в которой могут возникнуть непредвиденные обстоятельства. Первый вариант также лучше, потому что вы можете отключить его, как только появится memberModel. В текущем контексте это довольно нормально, но в перспективе могут быть варианты получше. Не уверен, почему это должно быть двустороннее связывание. Возможно, было бы лучше импортировать службу, которая предоставляет это memberModel напрямую, и связать ее с then , если она асинхронна.

2. @estus Вы правы, возможно, это не обязательно должна быть двусторонняя привязка, мне придется посмотреть, каким будет эффект, если просто передать нужные мне биты memberModel. Можете ли вы пояснить, что вы подразумеваете под ng-if созданием дочерней области?

3. Это все равно, что обернуть шаблон дополнительной директивой с помощью scope: true . ngIf создает новую унаследованную область с помощью преобразования, но результат тот же. Некоторые взаимодействия с областью могут работать не так, как ожидалось внутри ngIf или ngFor.

4. Понял, это имеет смысл. Спасибо за информацию.