【问题标题】:How to call ng-change when the ng-model is changed but not explictly如何在 ng-model 更改但未明确更改时调用 ng-change
【发布时间】:2015-10-06 07:20:53
【问题描述】:

好吧,问题的标题可能不清楚。所以在这里我解释一下:

我有一个输入字段 I1,其 ng-model 绑定到一个对象。

然后我有更多的输入字段,如果更改了它们的值,则会将它们相加并反映在 I1 的 ng-model 中。

现在,当通过在输入框中键入显式更改 I1 时,会触发其 ng-change。但是,如果 I1 的值因更多输入字段的变化而发生变化,则不会触发 I1 的 ng-change。

简而言之,I1中显示的值由于几个输入字段的变化而改变,但它的ng-change没有被触发。

如何触发 ng-change,即使 ng-model 已软更新 我希望读者能理解这里的想法,因为我知道阅读起来有点复杂

【问题讨论】:

  • 请分享相关代码以便更好地理解。
  • 分享代码可以降低阅读难度
  • 如果您想在字段 I1 的模型值更改时触发事件,您可能应该使用$watch 函数。
  • 你找到这个问题的答案了吗?
  • 好吧,我想这根本不是问题。这是ng-change 的预期行为。它仅在用户显式更改模型时触发。正确的实现方法是使用 Rabi、Chetan 和 Michael 建议的 $watch。我想知道我是怎么错过选择其中一个作为正确答案的。

标签: angularjs binding


【解决方案1】:

您可以在您的模型上使用手表并达到您想要的结果 -

HTML

<input type="text"  ng-model="l1" ng-change="doSomething()" />

控制器

$scope.$watch(function() { return $scope.l1;}, 
       function(newVal, oldVal) {
         if (newVal !== oldVal) {
             $scope.doSomething();
         }
});

或者,您可以查看此线程 - How to trigger ng-click [AngularJS] programmatically

但建议使用第一种方法。

【讨论】:

  • 感谢 Rabi 和 Chetan,因为他们都建议了相同的方法。但是,在这种情况下如何使用 $emit,我刚刚意识到 很少有输入字段在 I1 所在的 div 的 ng-repeat 中。**。我可以发射$emit('ng-change', arguments) 或类似的东西来向上传播更改
  • 是的,你可以。但是如果操作在同一个控制器上,你就不想发出一个事件,watch 就足够了。
【解决方案2】:

从下面的例子中得到想法:-

函数 MyController($scope) {

$scope.modelVar = 1;

$scope.$watch('modelVar', function() {

     alert('hey, modelVar has changed!');

  // here you can call onChange event.

});

}

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多