ng-model和ng-options不匹配?

时间:2014-07-22 22:01:51

标签: angularjs ng-options

我的资源对象中有一个方法:

resources.type

otherstuff: 'more strings'
type:'specifictype'
morestuff: 'morestuff'

用户可以通过下拉列表/通过另一个调用来更改此类型,该调用获取所有可能类型的列表,这些类型看起来像resourceList.types,其中包含像json这样的对象列表

types:
     [
         {name:'resourcetype1'}, 
         {name:'resourcetype2'},
         etc...
     ],

我的HTML看起来像:

<select ng-model="resources.type" ng-options="name.name for name in resourceList.types">
</select>

选择/下拉框填充了我的resourceList.type内容,但是当页面加载时,ng-model没有设置为已选择的资源类型。实际上,当您单击时,它会在下拉列表的顶部选择一个空白条目。这个角度有点挑剔吗?如何让ng-model以我想要的方式运行?

我尝试使用不同的方法来获取重复,但我觉得这更像是角度连接模型的方式。它是否只是将字符串与ng-options列表匹配?

这里是plnkr,因为你可以看到它没有默认为type1

http://plnkr.co/edit/NyWACtFQuyndR6CG8lpN?p=info

3 个答案:

答案 0 :(得分:8)

在Angular中,模型是真理的唯一来源 这意味着如果您想要选择一个值(并绑定到ngModel),则需要将其分配给模型:

<select ng-model="resources.type"
        ng-options="type.name as type.name for type in resourceList.types">
</select>

$scope.resources = {...};
$scope.resourceList = {
    ...
    types: [
        {name: 'resourcetype1'}, 
        {name: 'resourcetype2'},
        ...
    ]
};

// Set the model to the desired value
$scope.resources.type = $scope.resourceList.types[0].name;

另请参阅此 short demo

答案 1 :(得分:2)

您不必将模型的值设置为resourceList中的引用对象。事实上,如果没有这一行,接受的答案就可以正常运行:

$scope.resources.type = $scope.resourceList.types[0].name;

它是如何工作的?感谢ngOptions中的“as”表示法。如果没有“as”,则匹配是在完整类型元素(即对象)上进行匹配,因此匹配是在引用的对象上进行的,而不是名称的值。 使用“as”匹配元素的属性name。

我已经分叉了那个:http://plnkr.co/edit/kORfxGdsWBUlFWHXp6Ry?p=preview

答案 2 :(得分:1)

在我的情况下它没有用,因为ngOptions是一个整数数组,我试图将ngModal设置为字符串类型(2014年2)。

解决方案很简单:parseInt函数