使用AngularJS和ng-repeat初始化选择

Cha*_* O. 132 javascript angularjs

我正试图让选择框从使用Ang-repeat和AngularJS 1.1.5的预填充选项开始.相反,选择始终从未选择任何内容开始.它也有一个空选项,我不想要.我认为没有被选中的副作用.

我可以使用ng-options而不是ng-repeat来使用它,但我想在这种情况下使用ng-repeat.虽然我的缩小示例没有显示,但我也想设置每个选项的title属性,据我所知,使用ng-options无法做到这一点.

我不认为这与常见的AngularJs范围/原型继承问题有关.至少我在Batarang检查时没有看到任何明显的东西.此外,当您使用UI选择选项中的选项时,模型会更新正确.

这是HTML:

<body ng-app ng-controller="AppCtrl">
    <div>
        Operator is: {{filterCondition.operator}}
    </div>
    <select ng-model="filterCondition.operator">
       <option 
           ng-repeat="operator in operators" 
           value="{{operator.value}}"
       >
           {{operator.displayName}}
       </option>
    </select>
</body>
Run Code Online (Sandbox Code Playgroud)

和JavaScript:

function AppCtrl($scope) {

    $scope.filterCondition={
        operator: 'eq'
    }

    $scope.operators = [
        {value: 'eq', displayName: 'equals'},
        {value: 'neq', displayName: 'not equal'}
     ]
}
Run Code Online (Sandbox Code Playgroud)

JS小提琴:http://jsfiddle.net/coverbeck/FxM3B/2/

zs2*_*020 224

好.如果您不想使用正确的方法ng-options,可以添加ng-selected带有option指令的条件检查逻辑的属性,以进行预选工作.

<select ng-model="filterCondition.operator">
    <option ng-selected="{{operator.value == filterCondition.operator}}"
            ng-repeat="operator in operators"
            value="{{operator.value}}">
      {{operator.displayName}}
    </option>
</select>
Run Code Online (Sandbox Code Playgroud)

Working Demo

  • 我会给你信用,因为你自己想出来并做了完整的例子.虽然我不同意你关于ng-options是"正确方法"的评论.:)我自己总是使用ng-options,但这需要做一些ng-options不支持的东西,因为它很小.Angular文档说你也可以重复ng-repeat.谢谢,查尔斯 (37认同)
  • ng-options只有在其用例适合您的情况下才是正确的.您可能需要选项/ optgroup字段等中的额外属性/类. (11认同)
  • 我认为ng选择的表达式必须没有{{}}:ng-selected ="operator.value == filterCondition.operator" (11认同)
  • "正确的方法"有时不起作用(例如,如果你想翻译填充选项名称的字符串) (6认同)

Jer*_*ess 34

对于select标签,angular提供ng-options指令.它为您提供了设置选项和设置默认值的特定框架.这是使用ng-options的更新小提琴按预期工作:http://jsfiddle.net/FxM3B/4/

更新的HTML(代码保持不变)

<body ng-app ng-controller="AppCtrl">
<div>Operator is: {{filterCondition.operator}}</div>
<select ng-model="filterCondition.operator" ng-options="operator.value as operator.displayName for operator in operators">
</select>
</body>
Run Code Online (Sandbox Code Playgroud)

  • 嗨Jeremy - 我试图在没有ng-options的情况下这样做.就像我在我的问题和Shaun的回复中所说,我想在每个选项上设置title属性,据我所知,我不能用ng-options做到这一点.谢谢,查尔斯 (3认同)

Cha*_* O. 9

感谢TheSharpieOne指出了ng-selected选项.如果这是作为答案而不是评论发布的,我会做出正确的答案.

这是一个有效的JSFiddle:http://jsfiddle.net/coverbeck/FxM3B/5/.

我还更新了小提琴,使用了我在原帖中遗漏的title属性,因为它不是问题的原因(但这是我想使用ng-repeat而不是ng-options的原因) .

HTML:

<body ng-app ng-controller="AppCtrl">
<div>Operator is: {{filterCondition.operator}}</div>
<select ng-model="filterCondition.operator">
   <option ng-repeat="operator in operators" title="{{operator.title}}" ng-selected="{{operator.value == filterCondition.operator}}" value="{{operator.value}}">{{operator.displayName}}</option>
</select>
</body>
Run Code Online (Sandbox Code Playgroud)

JS:

function AppCtrl($scope) {

    $scope.filterCondition={
        operator: 'eq'
    }

    $scope.operators = [
        {value: 'eq', displayName: 'equals', title: 'The equals operator does blah, blah'},
        {value: 'neq', displayName: 'not equal', title: 'The not equals operator does yada yada'}
     ]
}
Run Code Online (Sandbox Code Playgroud)


Amm*_*adu 9

angular将空选项元素注入select的事实是默认绑定到它的模型对象在初始化时带有空值.

如果要选择默认选项,则可以在控制器的范围内进行设置

$scope.filterCondition.operator = "your value here";
Run Code Online (Sandbox Code Playgroud)

如果你想要一个空选项占位符,这对我有用

<select ng-model="filterCondition.operator" ng-options="operator.id as operator.name for operator in operators">
  <option value="">Choose Operator</option>
</select>
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但Angular会创建一个空白选项.怎么避免这个? (2认同)