当我更改范围值时,为啥我的 jQuery Slider Angular Directive 不会更新

Posted

技术标签:

【中文标题】当我更改范围值时,为啥我的 jQuery Slider Angular Directive 不会更新【英文标题】:Why will my jQuery Slider Angular Directive not update when I change the scope value当我更改范围值时,为什么我的 jQuery Slider Angular Directive 不会更新 【发布时间】:2017-03-25 16:21:11 【问题描述】:

我创建了一个 jQuery UI Slider Angular 指令。这是我的代码:

HTML

<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])。

请有人帮我理解为什么会这样。

谢谢,

本·布洛克

【问题讨论】:

放置 .then 而不是 .success。 创建一个 fiddler/plunkr 链接将帮助这里的人们快速解决它。 我创建了一个 plunkr 来演示这个问题。见这里:plnkr.co/edit/E8sSh3Nh5F6SHLFszuWl?p=preview 【参考方案1】:

我认为您的 applyFilters 事件处理程序是在更新指令范围之前执行的。您可以在触发事件之前发出延迟事件或强制角度更新范围。

看到这个: plnkr

但是,这不会使您的滑块按预期工作。滑块已创建,因此要修改其参数,您必须使用 option 方法,请参阅 docs.

我会在minmaxrange 上添加手表,如下所示:

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 );
); 

查看完整代码here

【讨论】:

以上是关于当我更改范围值时,为啥我的 jQuery Slider Angular Directive 不会更新的主要内容,如果未能解决你的问题,请参考以下文章

没有默认 CSS 的 jQuery 范围滑块

为啥我的 css 代码在 vuejs 中不起作用?

为啥当我为我的 CABasicAnimation 设置低持续时间值时它会跳跃?

当我尝试从文本文件输入值时,为啥我的类列表(在 C++ 中)会引发错误?

当我在选择上使用向上或向下箭头时,为啥 jquery 更改事件不触发?

更改下拉值时提高 jquery 的性能