次のディレクティブがあります。
directive('yearSlider', function(Filter) {
return {
restrict: 'E', // must be an element
transclude: false, // don't preserve content
controller: function($scope) {
$scope.$watch('yearMin + yearMax', function(newVal, oldVal) {
if(newVal === oldVal) return; // skip initialization
$("#year-slider").slider("option", "min", parseInt($scope.yearMin));
$("#year-slider").slider("option", "max", parseInt($scope.yearMax));
$("#year-slider").slider("value", $("#year-slider").slider("value"));
});
},
link: function postLink($scope, $element) {
$element.slider({
range: true,
min: 1900,
max: new Date().getFullYear(),
values: [ 1900, new Date().getFullYear() ],
slide: function(event, ui) {
$scope.yearFrom = ui.values[0];
$scope.yearTo = ui.values[1];
$scope.$apply();
},
change: function(event, ui) {
$scope.yearFrom = ui.values[0];
$scope.yearTo = ui.values[1];
Filter.apply($scope);
}
});
},
template:
'<div id="year-slider"></div>',
replace: true
}
}).
このディレクティブはビューで使用され、スライダーを正しくレンダリングします。
スライダーの両方の値を 2 つのモデルに割り当て、スライダーyearFrom
でyearTo
指定された年の範囲を取得します。場合によっては、スライダーの最小/最大値を変更する必要があり、それがcontroller
上記で行っていることです。
ここでの問題は、両方の値を監視してyearMin
おりyearMax
、これら 2 つのモデルが連続して変化し、コントローラーchange
が$element.slider
2 回実行されることです。
私が達成しようとしているのは、これを 1 回実行することですが、2 つのモデルがあるという事実は論理的に不可能です。