4

我有以下指令:

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
    }
}).

该指令在视图中使用并正确呈现滑块。

我将滑块的两个值分配给两个模型yearFrom,并yearTo获得滑块指定的年份范围。在某些情况下,我需要更改滑块的最小/最大值,这就是我在controller上面所做的。

这里的问题是我正在关注这两个值yearMinyearMax并且这两个模型连续变化,导致控制器和change执行$element.slider两次。

我想要实现的是执行一次,但我有两个模型的事实使得它在逻辑上是不可能的。

4

1 回答 1

6

我在写问题时想通了,我只是将模型更改为:

$scope.years = { min: data.yearMin, max: data.yearMax }

并将我的 $watch 更改为:

$scope.$watch('years', function(newVal, oldVal) {
    if(newVal === oldVal) return; // skip initialization

    $("#year-slider").slider("option", "min", parseInt($scope.years.min));
    $("#year-slider").slider("option", "max", parseInt($scope.years.max));
    $("#year-slider").slider("value", $("#year-slider").slider("value"));
});

将 JQuery 滑块放在一边,这是我使用 AngularJS 时面临的一个常见问题,特别是有许多模型向观察者触发多个事件,而我需要它们触发一次。我相信以类似的方式(如果适用)对它们进行分组可以解决这个问题。

于 2012-11-09T06:16:55.357 回答