首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用$filter创建和使用新的“过滤器”

用$filter创建和使用新的“过滤器”
EN

Stack Overflow用户
提问于 2014-01-06 20:34:57
回答 2查看 86关注 0票数 1

在阅读利用AngularJS掌握网络开发时,我尝试创建和使用一个使用$filter模块/关键字的新过滤器。

代码语言:javascript
复制
<div ng-controller="MyCtrl"> 
    <table>
        <thead>
            <th>Name</th>
            <th>Description</th>
        </thead>
        <tbody>
            <tr ng-repeat="item in backlog | trim:4">
                <td>{{item}}</td>
            </tr>
        </tbody>
    </table>
</div>

JavaScript

代码语言:javascript
复制
angular.module("myApp", [])
.filter("trim", function($filter) {
    var limitToFilter = $filter("limitTo");

    return function(input, limit) {
        console.log("input:", input, "limit:", limit);
        if(input.length > limit) {
            return limitToFilter(input, limit-3) + "...";
        }
        return input;
    };
});

function MyCtrl($scope) {
    $scope.backlog = ["asdfasdf", "BBBBBBBBB", "CCCCCCC", 
                     "DDDDDDD", "EEEE"];
}

我希望每个$scope.backlog项目的第一个字符($scope.backlog)出现。但是它似乎打印出了$scope.backlog中第一个项目的第一个字符,这对我来说是没有意义的。

http://jsfiddle.net/9Q6Sk/

EN

回答 2

Stack Overflow用户

发布于 2014-01-06 21:47:08

我能够让您的代码正常工作,但没有使用内置的limitTo过滤器。它可能是一个1.2.1版本的角错误,但我可以让它在他们的例子中工作。我要进一步调查。

我对代码所做的第一个更改是将过滤器从ng-repeat移到实际项。根据您的描述,您需要每个backlog项的第一个字符,而不是第一个待办项。

代码语言:javascript
复制
    <tr ng-repeat="item in backlog">                
        <td>{{ item | trim:4 }}</td>            
    </tr>

JavaScript

代码语言:javascript
复制
angular.module("myApp", []).filter("trim", function($filter) {

    return function(input, limit) {
    if(input.length > limit) {
        return $filter('limitTo')(input, limit-3);
    }
        return input;
    };
});

我将继续研究为什么limitTo不能工作,即使只是自己应用。

更新

我找到了limitTo不工作的原因。您有角1.0.1作为外部依赖项,它否决了1.2.1。1.0.1不包括limitTo过滤器。

查看这个小提琴以获得一个有用的示例

票数 1
EN

Stack Overflow用户

发布于 2014-01-06 21:55:30

首先要注意的是,您希望限制中的每个backlog项,因此不应该在ngRepeat指令上使用过滤器。需要注意的第二件事是,当查看limitToFilter函数的语法时,您将看到以下内容:

代码语言:javascript
复制
function (array, limit) {
    if (!(array instanceof Array)) return array;
    limit = int(limit);
    var out = [],
      i, n;

    // check that array is iterable
    if (!array || !(array instanceof Array))
      return out;

    // if abs(limit) exceeds maximum length, trim it
    if (limit > array.length)
      limit = array.length;
    else if (limit < -array.length)
      limit = -array.length;

    if (limit > 0) {
      i = 0;
      n = limit;
    } else {
      i = array.length + limit;
      n = array.length;
    }

    for (; i<n; i++) {
      out.push(array[i]);
    }

    return out;
  } 

可以清楚地看到,该函数是在数组类型上操作的,而不是字符串类型。因此,简单地说,您必须编写自己的过滤机制来限制您想要的字符串。

更新

实际上,我试着让它与ngRepeat和所有的东西一起工作:看看这个jsFiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20958778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档