我有一个集中我选择的 HTML 和功能的指令,但是我有一个问题,即 ng-change 发生后 ng-model 正在更新。
这是一个集中的 jsfiddle 示例:
http://jsfiddle.net/U3pVM/1568/
(代码,因为 SO 抱怨否则)
HTML:
<div ng-app="myApp">
<div ng-controller="MainCtrl">
<p>fooId is currently : {{fooId}}</p>
<app-drop-down model="fooId" options="fooOptions" opt-value="id" opt-label="label" on-change="dropDownChanged"></app-drop-down>
</div>
</div>
JS:
var app = angular.module('myApp', []);
app.controller('MainCtrl', function ($scope, $log) {
$scope.fooId = -1;
$scope.fooOptions = [{
id: 1,
label: "A"
}, {
id: 2,
label: "B"
}];
$scope.dropDownChanged = function (id) {
$log.info('changed : ' + $scope.fooId + ' but really: ' + id);
};
});
app.directive('appDropDown', function () {
return {
restrict: 'E',
replace: true,
scope: {
model: '=',
options: '=',
onChange: '='
},
template:
'<div><select ng-model="model" ng-options="a[optValue] as a[optLabel] for a in options" ng-change="changed()"></select></div>',
link: function (scope, element, attrs) {
scope.optValue = attrs.optValue;
scope.optLabel = attrs.optLabel;
scope.changed = function () {
scope.onChange(scope.model);
};
}
};
});
控制台日志:
更改:-1 但实际上:1
更改:1 但实际上:2
当您将选择更改为 A,然后更改为 B。
它正在更新,但在触发 ng-change 之后。
显然,我可以通过传递 id(就像我做的那样)或在控制器中使用 $watch 值来解决这个问题,但这对于某些更复杂的场景并不理想。
有任何想法吗?