坚持使用AngularJS过滤器

时间:2016-01-08 00:43:16

标签: angularjs

我有以下自定义过滤器,它会在一定数量的字符后截断文本:

test.app.filter('cut', function () {
return function (value, wordwise, max, tail) {
    if (!value) return '';

    max = parseInt(max, 10);
    if (!max) return value;
    if (value.length <= max) return value;

    value = value.substr(0, max);
    if (wordwise) {
        var lastspace = value.lastIndexOf(' ');
        if (lastspace != -1) {
            value = value.substr(0, lastspace);
        }
    }

    return value + (tail || ' …');
};
});

如果我将它应用于ng-options,它不起作用 - 下拉列表中的选项消失:

<select name="country" class="form-control" ng-options="country.value as country.label for country in countries | cut:true:20:' ...'" ng-model="address.Country" placeholder="{{'Country' | r | xlat}}" ng-required="address.IsCustEditable != false" ng-disabled="address.IsCustEditable == false" />

虽然在其他元素中很有用,例如:

  <strong>{{v.ExternalID | cut:true:20:' ...'}}</strong>

我做错了什么?

1 个答案:

答案 0 :(得分:1)

当你想要一个字符串时,你正在将一个对象传递给过滤器。

这就是为什么当你这样做的时候:

<strong>{{v.ExternalID | cut:true:20:' ...'}}</strong>

有效。如果你这样做了:

<strong>{{v | cut:true:20:' ...'}}</strong>

你会遇到类似的问题。

您可以将过滤器重写为take和object,如下所示:

test.app.filter('cut', function () {
return function (obj, wordwise, max, tail) {

    var value = obj.label || obj ;

    if (!value) return '';

    max = parseInt(max, 10);
    if (!max) return value;
    if (value.length <= max) return value;

    value = value.substr(0, max);
    if (wordwise) {
        var lastspace = value.lastIndexOf(' ');
        if (lastspace != -1) {
            value = value.substr(0, lastspace);
        }
    }

    return value + (tail || ' …');
};
});

但如果希望过滤器处理多个对象结构,那就会变得有点混乱。

您还可以重写ng-options语句。我总觉得ng-options dsl有点尴尬。以下是我认为你可以写这个的几种方法,但可能需要一些修补才能使它正确。这个想法仍然是相同的,你需要将字符串输入过滤器,而不是对象:

country.value as country.label for country in countries | cut:country.label:true:20:' ...'

或者像这样

country.value as (country.label | cut:true:20:' ...') for country in countries