AngularJS从选择菜单中截断ng-option值

时间:2014-08-26 17:54:51

标签: javascript jquery angularjs drop-down-menu ng-options

我有一个Angular Bootstrap选择插件应用于我的选择菜单,它将所选菜单项呈现如下:

            <button data-toggle="dropdown" class="btn btn-default dropdown-toggle" type="button">
                <div class="filter-option pull-left">Item with a very long name</div>&nbsp;<div class="caret"></div>
            </button> 

我正在尝试开发一个函数,如果它大于指定的长度,将截断所选的菜单项名称。

功能:

            $scope.truncate = function(){
                    var maxLength = 5;
                    $('button .filter-option').text(function(i, text) {
                        if (text.length > maxLength) {
                            return text.substr(0, maxLength) + '...';  
                        }
                    }); 
            }

调用Angular模板中原始选择标记的函数:

            <select
                class="nya-selectpicker"
                ng-model="items"
                ng-options="g.name for g in myItems"
                ng-change="truncate()">
                <option value="">Select</option>
            </select>

我的问题: 它没有截断我从菜单中选择的项目;它截断了模板中两个相邻选择菜单的默认项目。

如何更新此功能以截断我从菜单中选择的项目?

1 个答案:

答案 0 :(得分:0)

所以基本上你需要创建一个过滤器。然后,您可以在ng-options

中应用此过滤器
ng-options="(g.name | myFilter) for g in myItems"

myApp.filter('myFilter', function() {
  return function(val) {
    var maxLength = 5;
    if (val > maxLength) {
      return val.substr(0, maxLength) + '...';  
    } else {
      return val;
    }
  };
});

您可以改为对数组应用过滤器(我更喜欢上一个示例)

ng-options="g.name for g in myItems | myFilter"

myApp.filter('myFilter', function() {
  var maxLength = 5;
  return function(arr) {
    var returnArr = [];
    for(var i = 0; i < arr.length; i++) {
      (function() {
        var item = {};
        angular.copy(arr[i], item);
        if (item.name > maxLength) {
          item.name = item.name.substr(0, maxLength) + '...';
        }
        returnArr.push(item);  
      })();
    }
    return returnArr;
  };
});