为什么当我改变范围值时,我的jQuery滑动器Angular指令不更新?



我已经创建了一个jQuery UI Slider Angular指令。下面是我的代码:

<slider min="filters.price.min" max="filters.price.max" range="filters.price.range"></slider>
控制器

App.controller("MainController", function ($scope, $http) {
$scope.initFilters = function () {
    $scope.filters = {};
    $scope.filters.price = {};
    $scope.filters.price.min = 0;
    $scope.filters.price.max = 0;
    $scope.filters.price.range = [0, 0];
};
$scope.initFilters();
$http.get("someurl").success(function (data) {
    $scope.initFilters();
    $scope.filters.price = {};
    $scope.filters.price.min = 0;
    $scope.filters.price.max = 100;
    $scope.filters.price.range = [$scope.filters.price.min, $scope.filters.price.max];
    $scope.$broadcast("applyFilters");
});
});

指令

    App.directive('slider', function () {
return {
    restrict: 'E',
    replace: true,
    transclude: true,
    template: "<div class='slider'></div>",
    scope: {
        min: "=",
        max: "=",
        range: "="
    },
    link: function (scope, element, attrs) {
        $(element).slider({
            range: (scope.range != undefined),
            min: scope.min,
            max: scope.max,
            values: [scope.min, scope.max],
            slide: function (event, ui) {
                scope.$apply(function () {
                    scope.range = ui.values;
                });
            }
        });
        scope.$on("applyFilters", function () {
            console.log("APPLY FILTERS:", scope);
            console.log("APPLY FILTERS:", scope.min, scope.max, scope.range);
        });
    }
}
});

你可以从我的代码中看到,我的价格滑块被初始化为0。

然后我对web服务进行HTTP调用,并在收到响应后,我尝试将价格滑块的最小值,最大值和范围值设置为0-100。

由于某些原因,我的滑块在UI中保持为0。

事件处理程序中的控制台日志是最奇怪的…

第一个控制台日志打印出范围对象,它具有正确的值(即min = 0, max = 100和range =[0,100])。

第二个控制台日志打印出错误的值(即min = 0, max = 0和range =[0,0])。

有没有人能告诉我为什么会发生这种情况。

谢谢,Ben布洛克

我认为你的applyFilters事件处理程序在指令的范围更新之前执行。你可以用delay来触发事件,或者在触发事件之前强制angular更新作用域。

看到这个:plnkr

然而,这不会使您的滑块工作如您所期望的。Slider已经创建了,所以要修改它的参数,你必须使用option方法,参见docs .

我想在min, maxrange上添加如下表:

scope.$watch("min", function(value) {
  slider.slider( "option", "min", value );
});      
scope.$watch("max", function(value) {
  slider.slider( "option", "max", value );
});      
scope.$watch("range", function(value) {
  slider.slider( "option", "range", value );
}); 

查看完整代码

最新更新