Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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
Javascript 如何在自定义指令中包装ng更改?_Javascript_Angularjs - Fatal编程技术网

Javascript 如何在自定义指令中包装ng更改?

Javascript 如何在自定义指令中包装ng更改?,javascript,angularjs,Javascript,Angularjs,我有一个名为input text的简单指令,它基本上包装了一个输入控件 指定给input text属性的值被传递到ng model并正常工作。现在,我还想通过将该函数传递给名为input change的属性,来传递在模型发生任何更改时调用的函数 angular.module('test').directive('inputText', function() { return { restrict : 'A', scope : { inputText : '='

我有一个名为
input text
的简单指令,它基本上包装了一个输入控件

指定给
input text
属性的值被传递到
ng model
并正常工作。现在,我还想通过将该函数传递给名为
input change
的属性,来传递在模型发生任何更改时调用的函数

angular.module('test').directive('inputText', function() {
  return {
    restrict : 'A',
    scope : {
      inputText : '='
    },
    template : '<input ng-model="inputText" />',
    link : function(scope, element, attr) {
      var model = element.find('input').controller('ngModel');
      model.$viewChangeListeners.push(function() {
        scope.$parent.$eval(attr.inputChange);
      });
    }
  }

});

但输出与上面示例中的相同


有人能解释一下这个行为或者告诉我这里出了什么问题吗?

解决这个问题的一种方法是显式地公开其
输入更改
绑定上的输入值。为此,您可以使用此模板:

<input ng-model="inputText" ng-change="inputChange({value: inputText})" />

我以前也尝试过您的第一个建议,但这是非常不灵活的,因为我可能希望为函数添加可变数量的参数。第二个很明显,效果很好,谢谢。尽管如此,我还是想知道,在我解释的案例中,为什么这种行为是奇怪的。@M.Redemske,使用选项1,没有什么可以阻止您使用其他变量。它需要将
值添加为本地值。例如,您可以编写
test.callback(model1,value,model2)
,其中model1和model2来自上层作用域,而
value
由指令提供。至于你为什么会有这个问题,我个人也明白了,我从来都不知道这是Angular本身的一个bug,还是不清楚ng的变化。
<input ng-model="inputText" ng-change="inputChange({value: inputText})" />
link: function(scope) {
  scope.$watch('inputText', function(n) {
    scope.inputChange();
  });
}