$ watch ngModel没有开火

时间:2016-07-24 19:43:44

标签: angularjs

我已经制定了一个处理文件上传的指令,它在上传文件时起作用,但在预加载数据时不太好,因为模型上的手表没有给我预期的结果。

这些是代码的相关部分:

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);
        });
    }
 });

在这款手表中,我想在模型设置值时进行一些初始化,但我总是得到newVal和oldVal的“undefined”,“undefined”。可能我错过了一些基本的东西,但却找不到任何东西。

此外,调用$ setViewValue甚至不会触发监视:maybeI误解了一些东西,但我认为$ setViewValue改变了模型值,因此,我预计它会触发$ watch。

有人能解释我怎么认为所有这些东西都可以工作?我明显错过了什么。

1 个答案:

答案 0 :(得分:1)

如果你只是在指令中寻找双向绑定数据,那么使用=中的scope和链接功能中的$watch就是你需要的全部内容do(观察范围内变量的名称):

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

如果ng-model是该属性的名称,那么您的指令的消费者可能会感到困惑,因此我建议您选择一个不同的名称(最好不要以{{1}为前缀})。