Пользовательский атрибут AngularJS не оценивает первый раз запуска директивы

0

HTML

<a custom-attr='{{ controller.object.value }}' data-ng-model='controller.object.value'>

Угловая директива

.directive('customAttr', function () {
    return {
        require: 'ngModel',
        controller: 'ControllerName',
        controllerAs: 'cName',
        link: function (scope, el, attr, ctrl) {
            el.on('click', function ($event) {            
                if (ctrl.$viewValue && attr.customAttr) { // breakpoint
                }
            })   
        }
    }
})

Цель:

чтобы увидеть правильное значение в attr.customAttr при первом attr.customAttr директивы.

Описание

Остановившись в точке останова в выражении if внутри функции директивной ссылки, я ожидаю увидеть логическое значение. Я проверил логическое значение в модели с использованием $log.log(). К сожалению, при первом attr.customAttr директивы attr.customAttr оценивает строку ссылки на значение модели ('controller.object.value' в отладчике), а затем на последующих итерациях директивы она корректно вычисляет логическое значение, Я попытался удалить фигурные скобки из атрибута, и я просто получаю неизменную пустую строку.

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

Примечание. Я сделал аналогичную версию этого ранее с числовым значением без проблем. Главное отличие заключается в том, что рабочая версия находится на входном элементе и имеет атрибуты ngModel и ngValue.

Теги:
initialization
attributes
directive

2 ответа

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

Как оказалось, свойства контроллера и controllerAs влияют на это. Я удалил его, но потом решил, что я предпочел бы иметь контроллер, вместо этого я использовал изоляцию для оценки объекта вместо того, чтобы читать его из свойства attr.

0

Рассмотрите возможность использования

attrs.$observe('customAttr', function() {    
   scope.customAttr= scope.$eval(attrs.customAttr);
});

для правильного двойного связывания.attrs (и, вероятно, решения вашей проблемы) с вашей директивой.

Больше информации в этом ответе и в документах.

  • 0
    это не сработало для меня, но спасибо!

Ещё вопросы

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