2016-07-24 69 views
0

我做了一个处理文件上传的指令,它在上传文件时有效,但在预加载数据时效果不好,因为模型上的手表没有给我预期的结果。

而那些areis代码的相关部分:

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

这个w里面atch,我想在模型设置一个值时进行初始化,但对于newVal和oldVal,我总是会得到“undefined”,“undefined”。可能我错过了一些基本的东西,但是找不到任何东西。

此外,调用$ setViewValue甚至不会触发手表:maybeI误解了某些内容,但我认为$ setViewValue更改了模型值,所以我期望它触发$ watch。

有人能解释我应该怎么做所有东西的工作?我明显错过了一些东西。

+0

如果你想绑定到'ngModel'(及其所有的格式化器/校验器/等等),你必须在'link'函数中使用'controllers'(第四个位置我相信)参数(假设你使用'link'函数)并访问链接函数的['ngModelController'](https://docs.angularjs.org/api/ng/type/ngModel.NgModelController)参数。如果你只是想来回传递数据,你可以使用'='并做一个手表。你应该只需要看'ngModel'这个字符串,不过不是'attrs.ngModel'。 –

+0

这样的事情? CTRL $ setViewValue(scope.file)。我这样做,但它不会触发$ watch – sergio0983

+0

张贴部分“看字符串”作为答案... ^^ – sergio0983

回答

1

如果你只是希望在指令双向绑定的数据,在scope和链接功能的使用$watch=所有你需要做的(观看范围变量的名称):

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

这可能会造成混淆消费者的指令,如果ng-model是属性的名称,所以我建议你选择一个不同的名称(最好不与ng-前缀)。

+0

那么,角度语法对我来说仍然有点困惑,并且还不完全知道在哪里/如何使用东西(此外,还有很多引发混淆的例子,特别适用于ng模型)。但在这种情况下,有一个原因使用ngModel(我认为,如果我错了,请纠正我)。它应该作为输入工作,因此,使用相同的输入验证器(例如,我有一个序列化器工具读取表单的组件以构建多部分请求,而且我认为我不能这样做它没有绑定到ngModel)。 – sergio0983

+0

@ sergio0983:我认为关于Angular 2的唯一语法是它的表达式,但这主要是基于JavaScript的;其他的一切都是使用Angular API的HTML JavaScript。如果你想绑定到表单验证,ngModel将是推荐的方法。我会阅读关于表单,验证,ngModel等的整个文档,然后阅读一些博客,回顾一下,直到API有意义。 –

+1

是的,它也与角度表单验证绑定在一起,我所做的这个文件指令可以是一种形式,并且可以是必需的。谢谢。 – sergio0983