1

假设我有一个像这样的自定义过滤器:

app.filter('custom', function () {
  return function (input, search) {

    const ret = {};

    // find matches in input, given search
    ret[key] = input[key] // etc etc

    return ret;

});

这是与过滤器一起使用的 HTML:

   <div class="row" ng-repeat="(promptId, q) in myHash | custom:searchText">

我认为我需要做的是myHash在控制器中设置ret为自定义过滤器中的值吗?

这是正确的做法吗?如果是,我该怎么做?

换句话说,我应该这样做:

   app.filter('custom', function ($scope) {
      return function (input, search) {

        const ret = {};

        // find matches in input, given search
        ret[key] = input[key] // etc etc

        return $scope.myHash = ret;   // do not do this LOL

    });
4

2 回答 2

1

“[What] 我认为我需要做的,是myHash在控制器中设置ret为自定义过滤器中的值吗?”

不,那是错误的。过滤器不应修改其输入。它应该产生一个从输入(即它的函数参数)派生的新值。

来自关于过滤器的 AngularJS 文档(重点由我添加):

过滤器函数应该是一个纯函数,这意味着它应该总是在给定相同的输入参数的情况下返回相同的结果,并且不应该影响外部状态。”

据我所见,您已经以正确的方式进行操作(在您的第一个代码示例中)。

于 2017-04-17T08:15:35.163 回答
0

令人惊讶的是,以下工作。

前:

<div class="row" ng-repeat="(promptId, q) in myHash | custom:searchText">

后:

 <div class="row" ng-repeat="(promptId, q) in (myFilteredHash = (myHash | custom:searchText))">

所以现在,我在控制器的 $scope 中有第二个变量,名为myFilteredHash.

您可能可以将 $scope 传递给过滤器,然后设置myFilteredHash为结果。

我认为您唯一不应该做的是将原始值设置为过滤后的值,因为这样您基本上会丢失所有数据!最重要的是,您可能会为自己设置一个(无限的)摘要循环。

于 2017-04-17T08:36:25.870 回答