選択した 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 を使用することでこれを回避できますが、これは特定のより複雑なシナリオには理想的ではありません。
何か案は?