Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在自定义指令中更改两次_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs 在自定义指令中更改两次

Angularjs 在自定义指令中更改两次,angularjs,angularjs-directive,Angularjs,Angularjs Directive,附加的自定义指令允许使用ng更改属性 问题是,当我在同一个视图中使用它两次时,我注意到bar方法触发了两次,我发现问题是$viewchangelisters两次存储控制器的相同方法。注意:请注意,可能我已经用两种不同的ng更改方法对同一指令执行了两次 有人有办法克服这个问题吗 HTML: <my-directive ng-model="foo" items="items" ng-change="bar1(foo)"></my-directive> <my-dire

附加的自定义指令允许使用ng更改属性

问题是,当我在同一个视图中使用它两次时,我注意到bar方法触发了两次,我发现问题是
$viewchangelisters
两次存储控制器的相同方法。注意:请注意,可能我已经用两种不同的ng更改方法对同一指令执行了两次

有人有办法克服这个问题吗

HTML:

<my-directive ng-model="foo"  items="items" ng-change="bar1(foo)"></my-directive>
<my-directive ng-model="foo2" items="items" ng-change="bar2(foo2)"></my-directive>

指令:

template: '<div ng-repeat="item in items" ng-click="updateModel(item)">{{item}}</div>',
require: "ngModel",
scope : {
  items : "="
},
link: function(scope, element, attrs, ctrl){
  scope.updateModel = function(item)
  {
    ctrl.$setViewValue(item);
  }
  ctrl.$viewChangeListeners.push(function() {
    scope.$eval(attrs.ngChange);
  });
}
模板:“{{item}}”,
要求:“ngModel”,
范围:{
项目:“=”
},
链接:函数(范围、元素、属性、ctrl){
scope.updateModel=函数(项)
{
ctrl.$setViewValue(项目);
}
ctrl.$viewChangeListeners.push(函数(){
范围$eval(属性变化);
});
}


试试这个,点击向上(1),然后点击向下(1),然后点击向上(1)。当您的自定义输入指令“支持”
ngModel
,即它使用
ngModel
管道设置视图值时,会触发以下事件:bar1、bar2、bar1、bar2

,它会自动获得支持使用
ngModel
的其他指令的好处,如
ngrequired
ng maxlength
ng change

因此,不需要以下

ctrl.$viewChangeListeners.push(function() {
   scope.$eval(attrs.ngChange);
});

在您的特定示例中,它实际上不会两次触发
bar1()
/
bar2()
处理程序,因为
作用域。$eval(attrs.ngChange)
在没有
bar1()
bar2()
的隔离作用域内进行计算。因此,在您使用隔离作用域之前的测试中可能发生了这种情况。

我遇到了同样的问题,但在这个站点或其他地方找不到解决方案。在我的例子中,null被作为附加函数调用中的值发送。因此,我的解决方法是在函数中处理null:

$scope.bar1 = function(foo){
  if(foo != null){
    //perform the task
  }
};

抱歉,包括在内!你怎么认为它是那样燃烧的?我检查了它,我想当你第二次点击upper 1时它不会开火(因为它没有改变)。