【问题标题】:select/options ng-model is not bound with ng-selected选择/选项 ng-model 未与 ng-selected 绑定
【发布时间】:2015-05-10 09:09:53
【问题描述】:

JSFiddle

我有这个 AngularJS html 用于选择/选项,默认情况下根据外部值 (selectedGroup) 选择项目。此列表应该有一个空选项('-ROOT-' 选项):

<select class="form-control" ng-model="newDoor.groupId">
    <option value="">-ROOT-</option>
    <option ng-repeat="group in groups" ng-value="group.id" ng-selected="group==selectedGroup">
        {{group.name}}
    </option>
</select>

问题是: 当 ng-selected 条件导致选择一个选项时,ng-model 不受此选择的影响,但是当您更改选项时,ng-model 获取值。如何让 ng-model 的值直接取自动选择的选项?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您应该使用ngOptions。 ngOptions 旨在填充选择输入,使用作为属性传递的微语法。

    例如,在您的情况下,您可以使用以下内容:

    <select ng-model="newDoor.groupId" 
            ng-options="group.id as group.name for group in groups">
    

    这将列出groups 中的每个group,使用group.id 作为值并显示group.name 作为名称。它会为您处理更改检测。

    你需要做的唯一额外的事情就是考虑这个要求:

    此列表应该有一个空选项('-ROOT-' 选项):

    我通过在 groups 数组的前面添加另一个选项来做到这一点:

    $scope.groups.unshift({ name: '-ROOT-', id: -1 });
    

    最后,为了确保在初始化作用域时选择了真实的东西,这一行设置了newDoor.groupId

    $scope.newDoor = { groupId: $scope.groups[0].id }
    

    查看updated fiddle here

    【讨论】:

    • 是的,我搬到了 ng-options。但我不喜欢通过推送具有 -1 值的项目来更改数组的想法。
    • @AlBaraaSh 你不必使用-1,如果你愿意,你可以使用null,但是你会在数组中得到一个空项目(就像你接受的解决方案一样)。在我看来,在你的范围内拥有一个包含所有可选值的数组比在范围内拥有一些可选项目和在标记中拥有一些可选项目要整洁得多 - 这意味着你可以更好地分离关注点。
    • 关于关注点分离,你是对的,但是我的实际应用程序中的选项数组并不是专门用于这个选择的,这就是我不喜欢改变它的值的原因。关于选择选项数组中的空项,我不知道为什么它会出现在演示中,而我的实际应用程序中也没有。
    【解决方案2】:

    您可以在控制器中实现这一点,方法是先将其预定义为一个新对象,然后在为 selectedGroup 放置值时放置该值。

    代码:

    function doorsTreeController($scope) {
        $scope.newDoor = {};
        $scope.groups = [{
            name: 'G1',
            id: 1
        }, {
            name: 'G2',
            id: 2
        }, {
            name: 'G3',
            id: 3
        }, {
            name: 'G4',
            id: 4
        }];
        $scope.selectedGroup = $scope.groups[1];
        $scope.newDoor.groupId = $scope.selectedGroup.id;
    }
    

    Working Fiddle

    在 html 中有一个 ng-init,其余代码保持原样。

    <div ng-app>
        <div ng-controller='doorsTreeController'>
            <select class="form-control" ng-init="newDoor.groupId = selectedGroup.id" ng-model="newDoor.groupId">
                <option value="">-ROOT-</option>
                <option ng-repeat="group in groups" ng-value="group.id" ng-selected="group==selectedGroup">{{group.name}}</option>
        </select>Selected groupId is: {{newDoor.groupId}}</div>
    

    Updated Fiddle

    【讨论】:

    • 在这两种情况下,数组开头都有一个丑陋的空白项,当您选择某些内容时它会消失(这可能会使用户感到困惑)。这是因为控制器或ngInit 代码将在ng-repeat 内的代码之前运行,因此“2”的值将没有相应的输入。这没什么大不了的,但是这个,以及替代解决方案的简洁性,意味着我强烈建议只使用 angular 内置的指令。
    • 您指的是哪个空白项?我在任何演示中都没有它?
    • ngInit 对我不起作用,而 selectedGroup 将根据页面中的某些处理而改变。第一个解决方案工作正常,即使我更喜欢使用像 ngChanged 这样的东西来解决它。
    • @V31 运行演示,然后单击下拉列表 - 在列表顶部有一个空白项。一旦您选择其他内容,它就会消失。我用的是chrome,其他浏览器可能会不一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多