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

时间:2013-10-16 16:34:18

标签: javascript angularjs angularjs-scope

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

控制器

初始化“首选”。

if($scope.clients.length > 0) $scope.existingClient = $scope.clients[0];

查看

<select
    id='nm-existing-client-name'
    class='form-control  input-lg'
    ng-model='existingClient'
    ng-options="client.name for client in clients">
</select>

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

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

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

2 个答案:

答案 0 :(得分:123)

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

$scope.data = {
    existingClient: $scope.clients.length > 0 ? $scope.clients[0] : undefined
};

查看:

<select ng-model="data.existingClient" 
        ng-options="client.name for client in clients">
</select>

您可以使用chrome中的AngularJS Batarang extension来帮助调试示波器。

答案 1 :(得分:1)

这也是将参数保存到$ scope对象的解决方案:

控制器:

$scope.scope = $scope;
$scope.clients = [];
$scope.existingClient = $scope.clients.length > 0 ? $scope.clients[0] : undefined;

视图:

<select ng-model="scope.existingClient" ng-options="client.name for client in clients"></select>