Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在过滤器修改Angular中的下拉列表后删除空选项?_Javascript_Angularjs_Dropdown - Fatal编程技术网

Javascript 如何在过滤器修改Angular中的下拉列表后删除空选项?

Javascript 如何在过滤器修改Angular中的下拉列表后删除空选项?,javascript,angularjs,dropdown,Javascript,Angularjs,Dropdown,我正在使用Angularjs 1.4.2,我必须创建一个下拉列表,它是数字和文本的组合。它是一个具有两个属性的对象数组。因此,我使用数字作为标签类型,并将0值和-1值转换为文本作为列表的顶部和底部 我不只是硬编码文本的原因是在我们称之为服务的过滤器中更改页面文本的语言,这使得切换语言是动态的,因此我选择了选项条目的数字标签系统 但是,我一直在列表中看到一个空白选项,当下拉列表出现时,0的默认“选择项”文本无法预选 我发现的是 当ng模型引用值时生成空选项 在传递给ng选项的一组选项中不存在 在本

我正在使用Angularjs 1.4.2,我必须创建一个下拉列表,它是数字和文本的组合。它是一个具有两个属性的对象数组。因此,我使用数字作为标签类型,并将0值和-1值转换为文本作为列表的顶部和底部

我不只是硬编码文本的原因是在我们称之为服务的过滤器中更改页面文本的语言,这使得切换语言是动态的,因此我选择了选项条目的数字标签系统

但是,我一直在列表中看到一个空白选项,当下拉列表出现时,0的默认“选择项”文本无法预选

我发现的是

当ng模型引用值时生成空选项 在传递给ng选项的一组选项中不存在

在本例中,放在范围中的原始列表 已被过滤器修改,因此我假设这就是为什么下拉列表中出现空选项的原因

我的代码在没有过滤器的情况下可以正常工作,但当我尝试应用过滤器时,会出现以下错误: 错误:[$rootScope:infdig]已达到10$digest()迭代次数。流产

下拉列表中确实有过滤器中的正确值,但是空选项仍然存在,并且它被选中,而不是我想要的文本“Select Item”

HTML:

<!DOCTYPE html>
<html ng-app="app">
  <head>
    <script data-require="angular.js@1.4.2" data-semver="1.4.2" src="https://code.angularjs.org/1.4.2/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

   <body>
    <div ng-controller="Test">
        <p>selected item is : {{selectedItem}}</p>
      <p> The distance of selected item is : {{selectedItem.distance}} </p>
      <select ng-model="selectedItem" ng-options="item.distanceSize for item in items | myFilter" ng-init="selectedItem = items[0]">
      </select>
    </div>
  </body>
</html>

所选项目为:{selectedItem}

所选项目的距离为:{selectedItem.distance}

script.js

var app = angular.module('app',[]);

app.controller('Test',function($scope){
   $scope.items = [{"distance": "0", "distanceSize": 0},{"distance": "25", "distanceSize": 25},{"distance": "50", "distanceSize": 50},{"distance": "-1", "distanceSize": -1}];
});

app.filter('myFilter', function () {
  return function (items) {
    var valuesArray = [];
            if(items) {
                for(var i = 0; i < items.length; i++) {
                    var myObject = {};

                    if(items[i].distanceSize === 0) {
                        myObject.distanceLabel = "0";
                        myObject.distanceSize = "Select Item";
                        valuesArray.push(myObject);
                    }else if(items[i].distanceSize == 25) {
                        myObject.distanceLabel = "25";
                        myObject.distanceSize = 25;         
                        valuesArray.push(myObject);
                    }
                    else if(items[i].distanceSize == 50) {
                        myObject.distanceLabel = "50";
                        myObject.distanceSize = 50;         
                        valuesArray.push(myObject);
                    }
                    else if(items[i].distanceSize == -1) {
                        myObject.distanceLabel = "-1";
                        myObject.distanceSize = "Select Everything";            
                        valuesArray.push(myObject);
                    }
                }
            }
            return valuesArray;
  };
});
var-app=angular.module('app',[]);
应用程序控制器('测试',功能($范围){
$scope.items=[{“距离”:“0”,“距离大小”:0},{“距离”:“25”,“距离大小”:25},{“距离”:“50”,“距离大小”:50},{“距离”:“-1”,“距离大小”:-1}];
});
app.filter('myFilter',函数(){
返回函数(项目){
var值ray=[];
若有(项目){
对于(变量i=0;i
由于我的下拉列表被过滤器修改,我如何删除或屏蔽空选项,为什么过滤器抛出错误

已达到10$digest()迭代次数。流产

这是一个众所周知的问题。我要提到这个堆栈溢出问题:,具体地说,它的答案是每次angular调用
myFilter
时,它都会得到一个新的valuesArray,而不是===旧的valuesArray。Angular将此视为一个更改,并一次又一次地调用筛选器,直到它因错误而中止

将过滤器应用于标签,而不是将过滤器应用于整个阵列。这将更改您的ng选项:

ng-options="item.distanceSize for item in items | myFilter"

然后更改过滤器以处理单个项目:

app.filter('myFilter', function () {
    return function (distanceSize) {
        if (distanceSize === 0)
            return "Select Item";

        if (distanceSize === -1)
            return "Select Everything";

        return distanceSize;
    }
});
你可以从中看到一个例子


出现空选项是因为
$scope.selectedItem
是空值。您可以将其设置为默认值(就像我在plunker中所做的那样),也可以硬编码单个元素,将值设置为空字符串。然后,该元素将表示空或“未选择”选项。这可能会取代您的“选择项目”选项。您可以在中找到有关此问题的更多信息。

由于不完全了解此问题背后的过程,我的过滤器过于复杂。谢谢你花时间在这件事上!
app.filter('myFilter', function () {
    return function (distanceSize) {
        if (distanceSize === 0)
            return "Select Item";

        if (distanceSize === -1)
            return "Select Everything";

        return distanceSize;
    }
});