2014-03-26 72 views
9

我有以下的HTML角JS:得到NG-变化NG-模型

<select ng-model="country" ng-options="c.name for c in countries" ng-change="filterByCountry"></select> 

也就是说与否有关下列对象与各国

$scope.countries = [{name:Afeganistão, country:AF}, {name:África do Sul, country:ZA}, name:Albânia, country:AL}, {name:Alemanha, country:DE}, {name:Andorra, country:AD} ...]; 

当我改变列表喂我下拉值我期待我的模型($ scope.country)被更新,在filterByCountry函数内,但事实并非如此。我在这里错过了什么?

+1

不需要ng-change需要括号'ng-change =“filterByCountry()”'然后在方法中访问$ scope.country。 – BenCr

+0

确切地说,这似乎是问题... http:// jsbin。COM/paguwehu/2/ – PSL

+1

创建这里的时候,这个问题我忘记了括号,但在这里不是问题 –

回答

7

ng-change处理程序在ng-model实际更新之前被触发。如果你想filterByCountry将每次发射$scope.country变化(而不是仅仅在下拉菜单的变化),你应该使用,而不是执行以下操作:

$scope.$watch('country', filterByCountry); 

我总是发现更多有用的反应在我$scope的变化,而不是尽可能的DOM事件。

+0

我已经尝试过的解决方案,但改变下拉值时手表不beeing触发:S –

+0

@JoaoAlmeida - 你有一个小提琴或任何东西? –

+3

你的回答是对的(尽管我在提问之前尝试了这个解决方案)。我的问题是,我正在使用ng-if来显示下拉菜单。我更改为ng-show,现在工作正常。谢谢;) –

5

只是为了其他任何人来到这里, ng-change后模型值已设置实际上是所谓

为什么?
让我们看看它何时被调用。 从angular source code,ng-change只是该指令定义对象(DDO)的一个属性指令。

{ 
    restrict: 'A', 
    require: 'ngModel', 
    link: function(scope, element, attr, ctrl) { 
     ctrl.$viewChangeListeners.push(function() { 
     scope.$eval(attr.ngChange); 
     }); 
    } 
} 

由此我们看到ng-change指令非常简单。 ng-change='<expr>'所做的只是在$viewChangeListeners的末尾添加一个函数,该函数通过$scope.$eval评估<expr>

OK ...那么什么时候ViewChangeListeners被调用?

那么,如果我们看一下文档ngModel.NgModelController

新的值将被应用到$ modelValue然后在NG-模型属性指定的表达。 最后,在$ viewChangeListeners列表中的所有已注册的更改侦听器都称为

所以viewChangeListener为ngChange将被调用后的值被应用于$modelValue。因此回调将在模型设置后调用

另请注意,此行为在所有版本的angular中都是相同的。自v1.2以来,ng-change的定义没有改变。