AngularJS:选择不对模型进行双向绑定

Tyl*_*dix 45 javascript angularjs angularjs-scope

我使用select来显示客户端名称.用户应该能够选择现有客户端,然后更新范围属性:

调节器

初始化"第一选择".

if($scope.clients.length > 0) $scope.existingClient = $scope.clients[0];
Run Code Online (Sandbox Code Playgroud)

视图

<select
    id='nm-existing-client-name'
    class='form-control  input-lg'
    ng-model='existingClient'
    ng-options="client.name for client in clients">
</select>
Run Code Online (Sandbox Code Playgroud)

existingClient选择菜单更改时,scope属性不会更改.如果没有初始化值(上面的控制器行被删除),则值existingClient将保持未定义.

ng-change当值更改时附加将触发,但模型本身不会更新为新值.

我正在使用AngularJS v1.2.0-rc.3.

Jas*_*aat 123

我想你可能正在使用一个子范围而且不知道它. ng-if,ng-repeat,ng-switchng-include所有创建子作用域.范围上的值是继承的,但是如果更改子范围中的值,它会在子范围上设置一个值,并在父项上保持继承的值不变.尝试使用对象来保存您的值并查看是否修复了它.由于您只是在对象上设置属性而不是直接在作用域上设置值,因此它将使用父作用域的继承对象并更新该值.

$scope.data = {
    existingClient: $scope.clients.length > 0 ? $scope.clients[0] : undefined
};
Run Code Online (Sandbox Code Playgroud)

视图:

<select ng-model="data.existingClient" 
        ng-options="client.name for client in clients">
</select>
Run Code Online (Sandbox Code Playgroud)

您可以在chrome中使用AngularJS Batarang扩展来帮助调试示波器.

  • 我在更高的块中使用了`ng-if`,这创建了一个新的范围.感谢您的帮助. (15认同)
  • 哇,这种见解非常有帮助.当Angular隐式创建子范围时,这很难诊断.谢谢. (5认同)
  • 如果它对任何人有帮助,我发现我的范围嵌套了两层.尝试使用ng-model ="$ parent.$ parent.myVariable"来查看.创建子范围有什么好处? (2认同)