初始ng模型值未在select中设置

sbo*_*sse 21 selection option angularjs

我有一个枚举(我使用TypeScript编写代码):

export enum AddressType
{
    NotSet = 0,

    Home = 1,
    Work = 2,
    Headquarters = 3,

    Custom = -1,
}
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器中有一个名为type的字段,我在其中设置了应该在select输入中选择的初始值(我将其设置为AddressType.Headquarters).

最后,在我的HTML中我提出以下内容:

<select ng-model="Ctrl.type" ng-options="addressType for addressType in Ctrl.getAddressTypes()"></select>
Run Code Online (Sandbox Code Playgroud)

除了一件事之外,一切似乎都运行正常:由于某种原因,Angular在所有绑定更新后最初都没有在选择中选择"3"(总部).Angular会创建一个额外的选项,而不是:

<option value="?" selected="selected"></option>
Run Code Online (Sandbox Code Playgroud)

因此,由于某种原因,Angular无法确定在组合中选择的初始选项.

如果用户选择组合框的另一个选项,则Ctrl.type会正确更新,因此绑定对该部分的工作正常.基本上我的问题只是最初应该选择的选项未按预期选择.

我在这里错过了什么导致了这个问题?

sbo*_*sse 32

发现问题:

Ctrl.getAddressTypes()返回的数组是一个字符串数组:

["0", "1", "2", "3", "1"]
Run Code Online (Sandbox Code Playgroud)

并且Ctrl.type中存储的内容的类型为number.

AngularJS使用'==='运算符将提供给ng-options的数组与提供给ng-model的值进行比较.在这种情况下,3不等于"3" - 这就是为什么它不起作用.

  • 只是节省了我的时间!Thankx (2认同)

Wil*_*ern 16

我经常在使用数字ID时遇到这种情况.我绕过这个怪癖的方法是添加''+将其转换为字符串类型:

<select ng-options="''+u.id as u.name for u in users"
Run Code Online (Sandbox Code Playgroud)