$ watch ngModel не стреляет

0

Я сделал директиву для обработки загрузки файлов, и он работает при загрузке файлов, но не настолько хорош при предварительной загрузке данных, потому что часы на модели не дают мне ожидаемых результатов.

И они являются соответствующими частями кода:

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.

Может ли кто-нибудь объяснить мне, как предполагается, что все это работает? У меня явно чего-то нет.

  • 0
    Если вы хотите ngModel к ngModel (и всем его форматерам / валидаторам и т. Д.), Вы должны использовать аргумент controllers (4-й позиционный, я полагаю) в функции директивы link (при условии, что вы используете функцию link ) и получить доступ к ngModelController аргумент функции ссылки. Если вы просто хотите передать данные назад и вперед, вы можете использовать = и посмотреть. Вам просто нужно посмотреть строку 'ngModel' , но не attrs.ngModel .
  • 0
    что-то вроде того? Ctrl $ setViewValue (scope.file). Я делаю, но это не увольняет часы
Показать ещё 3 комментария
Теги:

1 ответ

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

Если вы просто ищете двунаправленные данные привязки в директиве, используйте = в scope и $watch в функции ссылок - все, что вам нужно сделать (посмотрите имя переменной в области):

scope.$watch('ngModel', function (/* ... */) { /* ... */ });

Это может смутить потребителей ваших директив, если ng-model - это имя атрибута, поэтому я бы рекомендовал выбрать другое имя (желательно, это не префикс ng-).

  • 0
    Ну, угловой синтаксис все еще немного сбивает меня с толку, и я до сих пор не знаю полностью, где / как использовать вещи (кроме того, есть много примеров, которые приводят к путанице, особенно реалистичной для ngmodel). Но в этом случае есть причина использовать ngModel (думаю, поправьте меня, если я ошибаюсь). Предполагается, что он будет работать как вход, и, таким образом, использовать те же валидаторы ввода (например, у меня есть инструмент сериализатора, который читает компоненты формы для создания многочастного запроса, и я думаю, что не мог сделать это без привязки к ngModel).
  • 0
    @ sergio0983: Я думаю, что единственное, что синтаксически в Angular 2, это его выражения, но в основном это JavaScript; все остальное - HTML JavaScript с API Angular. Если вы хотите подключиться к проверке формы, ngModel будет рекомендуемым подходом. Я прочитал бы всю документацию по формам, валидации, ngModel и т. Д., А затем прочитал некоторые блоги, переходя назад и вперед, пока API не станет понятным.
Показать ещё 1 комментарий

Ещё вопросы

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