在指令

时间:2016-02-16 10:31:39

标签: angularjs

尝试编写允许双向绑定的角度模型,I.E。它有一个ng-model变量,如果控制器更新它,它会更新指令,如果指令更新它,它会为控制器更新。

我已经调用了控制器范围变量ng-model和指令模型bindModel。在这种情况下,它会发送一个数据数组,但这不应该对绑定的工作方式产生影响(至少我认为)。

首先是映射,这是初始指令的外观(链接稍后)。

return {
    link: link,
    scope: { cvSkills: '=',
        bindModel:'=ngModel'},
    restrict: 'E'

}

我的理解是(并且我不确定此时的确切范围)该指令将了解cvSkills(内部称为cvSkills,用于提供初始数据),以及应该在ng-model中获取什么的bindModel )。 html中的调用是:

<skilltree cv-skills="cvskills" ng-model="CV._skillSet"></skilltree>

因此变量在指令中实际上(非常)尚未实现。但是他们已经意识到这一点,所以我创建了两个观察者(暂时忽略了cvskills)

   function link(scope,element, attr){
        //var selected = ["55c8a069cca746f65c9836a3"];
        var selected = [];
        scope.$watch('bindModel', function(bindModel){
            if (bindModel.length >> 0) {
                console.log("Setting " + bindModel[0].skill)
                selected = bindModel;
            }
        })
        scope.$watch('cvSkills', function(cvSkills) {

因此,一旦范围。$ watch看到对bindModel的更新,它会将其选中并将其存储到选定的(与cvSkills分开发生)。在cvskills中,我然后对选中进行更新。因此,如果用户单击按钮,它将添加其他数据。一切都有效,没什么特别的我现在的问题是。当有选定的更新时,如何更新bindModel(或ngModel),以便控制器范围选择它。基本上,如何将更新传播到ng-model="CV._skillSet"

这是正确的做法。 I.E.让范围知道,而不是通过范围获取更改。$ watch并手动更新变量,或者是更多&#34; direct&#34;这样做的方式?

===================使用ngModel修复===================

根据文章,如果你添加require:&#34; ngModel&#34;你得到函数的第四个选项(并跳过在ngModel和bindModel之间绑定)。

return {
    link: link,
    require: 'ngModel',
    scope: { cvSkills: '='},
    restrict: 'E'

}

完成后,ngModel.viewValue将包含来自ngModel =的数据,在我的情况下,我在代码中更新它(这可能是一个坏主意)。然后调用ngModel.setViewValue。如果您设置变量然后将其直接存储(如下所示),则可能是安全的

功能链接(范围,元素,attr,ngModel){

ngModel.$render =  function()  {
    console.log("ngRender got called " + ngModel.$viewValue );

} ;
....
ngModel.$viewValue.push(newValue);
ngModel.$setViewValue(ngModel.$viewValue)

=================如果你不关心viewValue ================== 您可以使用modelValue而不是viewValue,并且直接传播对modelValue的任何更新。 函数链接(范围,元素,attr,ngModel){

ngModel.$render =  function()  {
    console.log("ngRender got called " + ngModel.$modelValue );

} ;
....
ngModel.$modelValue.push(newValue);

1 个答案:

答案 0 :(得分:1)

使用指令的require属性,您可以使用ngModel指令中的控制器API。所以你可以更新值。

在这里看看这个非常简单的演示:https://blog.hadrien.eu/2015/01/16/transformation-avec-ngmodel/

有关详细信息,请参阅文档:https://docs.angularjs.org/#!/api/ng/type/ngModel.NgModelController