Javascript Angular JS:get ng model on ng change
我有下面的HTMLJavascript Angular JS:get ng model on ng change,javascript,angularjs,Javascript,Angularjs,我有下面的HTML <select ng-model="country" ng-options="c.name for c in countries" ng-change="filterByCountry"></select> 当我更改下拉列表值时,我希望在filterByCountry函数中更新我的模型($scope.country),但事实并非如此。这里我缺少什么?在实际更新ng模型之前,启动ng change处理程序。如果希望每次$scope.country更改时
<select ng-model="country" ng-options="c.name for c in countries" ng-change="filterByCountry"></select>
当我更改下拉列表值时,我希望在filterByCountry函数中更新我的模型($scope.country),但事实并非如此。这里我缺少什么?在实际更新
ng模型之前,启动ng change
处理程序。如果希望每次$scope.country
更改时(而不仅仅是下拉列表更改时)都触发filterByCountry
,则应使用以下选项:
$scope.$watch('country', filterByCountry);
我总是发现,在可能的情况下,对我的$scope
中的更改做出反应比对DOM事件做出反应更有用。仅适用于任何其他来到这里的人,
ng change
实际上是在设置了模型值之后调用的
为什么?
让我们看看什么时候叫它。
从中可以看出,ng change
只是带有此指令定义对象(DDO)的属性指令
由此我们可以看出,ng change
指令非常简单。ng change=''
所做的一切就是在$viewchangelisters
的末尾添加一个函数,该函数通过计算
好的。。。那么什么时候调用ViewChangeListeners呢
好吧,如果我们看一下以下文件:
新值将应用于$modelValue,然后应用于ng model属性中指定的表达式最后,$viewChangeListeners列表中所有注册的更改侦听器都被称为
因此,ngChange的viewChangeListener将在值应用于$modelValue
后被调用。因此,将在设置模型后调用回调
还请注意,此行为在angular的所有版本中都是相同的。ng change
的定义自v1.2版以来没有改变。正如詹姆斯·劳森所指出的那样
ng更改实际上是在设置了模型值之后调用的
如果你还在问
为什么我会看到相反的行为
然后您应该知道$scope是从其父级继承的原型,如果您的scope变量只是一个简单类型(字符串、布尔值等),那么它将在子范围中被覆盖为ng model指令设置的值
要查看子作用域是在何处创建的(在哪个DOM元素上),您可以打开开发工具并查找元素上的class=“ng scope”
是否需要括号ng change=“filterByCountry()”
,然后只需访问方法中的$scope.country。这似乎就是问题所在。。。我在此处创建问题时忘记了括号,但这不是问题所在我已经尝试了您的解决方案,但更改下拉列表值时未触发手表:S@JoaoAlmeida-你有小提琴什么的吗?你的回答是对的(尽管我在问问题之前试过这个方法)。我的问题是我使用ng if来显示下拉列表。我为ng show换衣服,现在工作正常。谢谢;)@贾斯汀尼斯纳,这是不正确的<更新ng model
后将触发code>ng change
:。事实上,如果您只想对用户发起的请求做出反应,那么添加$watch
的成本是不必要的changes@NewDev-现在可能是这样(我还没有检查Angular的最新版本),但在提出这个问题时没有。而且,仅对用户发起的更改做出反应(无论是否增加成本)会破坏双向数据绑定,并且如果应用程序不是非常基本的应用程序,那么以后将不可避免地导致问题。现在为什么我会看到相反的行为?
$scope.$watch('country', filterByCountry);
{
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ctrl) {
ctrl.$viewChangeListeners.push(function() {
scope.$eval(attr.ngChange);
});
}
}