【问题标题】:How to send filtered param to a directive如何将过滤后的参数发送到指令
【发布时间】:2017-09-10 10:21:44
【问题描述】:

我有一个像这样的照片轮播指令

<mz-photo-carousel items-per-slide=6
                   carousel-data="vm.carouselData">
</mz-photo-carousel>

在指令内部,它只是 html 以显示带有传递数据的轮播

<div uib-carousel active="active" no-wrap="noWrapSlides">
    <div uib-slide ng-repeat="slide in vm.carouselData">
     ....
    </div>
</div>

我想像这样将过滤后的数据发送到 mz-photo-carousel 指令:

<mz-photo-carousel items-per-slide=6
                   carousel-data="vm.carouselData | myFilter:param">
</mz-photo-carousel>

我不想在 mz-photo-carousel 指令中进行过滤,因为我想让它通用以仅处理它获取的数据。

【问题讨论】:

  • 此代码不足以理解问题,能否请您与问题分享JSFiddle
  • 这是给你们的 JSFiddle:jsfiddle.net/y9arvut1/1 看看这行代码: 我正在尝试将过滤后的数组传递给指令,我在控制台中得到错误

标签: javascript angularjs angularjs-directive angularjs-filter


【解决方案1】:

问题在于,由于您将两种方式的数据绑定设置为array 属性。

参考来自 SO 答案:

SO Answer

当您将过滤作业传递给您的指令时,角度将放置一个手表 在你的工作变量上。因此,当在指令监视中分配工作时 被调用,这将再次触发过滤器,这将继续 直到角度达到最大消化周期。

为避免这种情况,您可以创建一个过滤器方法并将其传递给 ng-model 中的方法。这样您就可以避免复制创建和 最大消化周期误差。

所以为了消除错误。使用下面的 JS 在指令中使用过滤器。还提供了演示。

JSFiddle Demo

JS:

var demo = angular.module('demo', []);
demo.directive('arrayDisplay', function($parse, $filter){
    return {
        restrict: 'E',
        replace: true,
        transclude: false,
        scope: {array: '=', from: '=', to:'='},
        template: '<span>{{array}}<span>after the filter is applied : {{filtered}}</span></span>',
        link: function(scope, element, attrs){
            scope.filtered = $filter('slice')(scope.array, scope.from, scope.to);
        }
    }
 });

demo.filter('slice', function() {
    return function(input, from, to) {
        return input.slice(from, to);  
  };
})

function MyCtrl ($scope) {
    $scope.array = [1,2,3,4,5,6,7,8,9,10];   

};

【讨论】:

  • 这个答案并不是很有帮助,正如我之前所说,我不想在指令中使用过滤器,这意味着我不想在链接函数中使用 $filter 或在指令 html 中使用过滤器或任何其他迫使我在指令中过滤的选项。我只是想在指令之外进行过滤,并将过滤后的值作为指令的参数,如演示中所示
  • @RonYaari 好的,我明白了,您对这种方法有疑问,另一种选择是使用 $watch ,请参考此 JSFiddle,但请注意,如果您使用过滤,例如你已经完成了小提琴,这将触发错误10 $digest() iterations reached.
  • 你用 $watch 提供的东西对我来说仍然不够好,因为你仍然在控制器中过滤数组,我的简单问题是,如果无论如何要像这样过滤它:
  • @RonYaari Applogies,我不知道这个问题的解决方案 :( 感谢您的宝贵时间!
猜你喜欢
  • 2015-04-02
  • 2017-03-14
  • 2015-01-10
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多