Я сделал директиву для обработки загрузки файлов, и он работает при загрузке файлов, но не настолько хорош при предварительной загрузке данных, потому что часы на модели не дают мне ожидаемых результатов.
И они являются соответствующими частями кода:
http://codepen.io/sergio0983/pen/EyLwaQ?editors=1011
та часть, которая вызывает у меня головную боль, такова:
<div ng-app = 'app' ng-controller = 'customCtrl'>
<file ng-model = 'doc' placeholder = 'modelEmpty' required></file>
<file ng-model = 'existingDoc' placeholder = 'modelNotEmpty' ng-required></file>
<div>
JS
app.controller("customCtrl", function($scope){
$scope.existingDoc = "filename.jpg"
})
app.directive("file", function($parse){
return{
restrict:"E",
require:"?ngModel",
scope:{
ngModel:"="
},
transclude:true,
.....
link:....
scope.$watch(attrs.ngModel, function(newVal, oldVal){
console.debug(newVal, oldVal);
});
}
});
Внутри этих часов я хочу выполнить некоторую инициализацию, когда модель имеет значение, но я всегда получаю "undefined", "undefined" для newVal и oldVal. Наверное, я что-то пропустил, но ничего не нашел.
Кроме того, вызов $ setViewValue даже не запускает часы: возможно, я что-то понял, но я думал, что $ setViewValue изменило значение модели, и поэтому я ожидал, что он запустит $ watch.
Может ли кто-нибудь объяснить мне, как предполагается, что все это работает? У меня явно чего-то нет.
Если вы просто ищете двунаправленные данные привязки в директиве, используйте =
в scope
и $watch
в функции ссылок - все, что вам нужно сделать (посмотрите имя переменной в области):
scope.$watch('ngModel', function (/* ... */) { /* ... */ });
Это может смутить потребителей ваших директив, если ng-model
- это имя атрибута, поэтому я бы рекомендовал выбрать другое имя (желательно, это не префикс ng-
).
ngModel
кngModel
(и всем его форматерам / валидаторам и т. Д.), Вы должны использовать аргументcontrollers
(4-й позиционный, я полагаю) в функции директивыlink
(при условии, что вы используете функциюlink
) и получить доступ кngModelController
аргумент функции ссылки. Если вы просто хотите передать данные назад и вперед, вы можете использовать=
и посмотреть. Вам просто нужно посмотреть строку'ngModel'
, но неattrs.ngModel
.