45

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

控制器

初始化“第一选择”。

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

4

2 回答 2

125

我认为您可能正在使用子范围并且不知道。 ng-if, ng-repeat,ng-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 扩展来帮助调试您的范围。

于 2013-10-16T18:05:47.590 回答
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>
于 2014-02-07T13:27:14.890 回答