Javascript Angular JS:get ng model on ng change

Javascript 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更改时

我有下面的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
更改时(而不仅仅是下拉列表更改时)都触发
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);
      });
    }
}