没有$ watch的角度变化数据集

时间:2016-05-27 08:18:05

标签: javascript angularjs

我有一个像这样的对象数组

UserList = [
{name:'user1',id:1,data:{}},
{name:'user4',id:4,data:{}},
{name:'user7',id:7,data:{}}
]

并且html选择这样

<select ng-model="data.selectedUser">

    <option ng-repeat="item in data.items" value="{{item.id}}">{{item.name}}</option>

</select>

<p>{{data.userPhone}}</p>

在我的控制器中,我使用

$scope.data = {};
$scope.data.selectedUser = 0;
$scope.data.items = UserListModel.items;
$scope.data.userPhone = UserListModel.items[$scope.data.selectedUser].phone;

有没有办法在selectUser更改时更新所选用户手机而不使用$ watch并填充&#34; $ scope.data.userPhone&#34;在里面?

2 个答案:

答案 0 :(得分:2)

一种可能性是

$scope.data.userPhone = function () { 
    return UserListModel.items[$scope.data.selectedUser].phone;
}

这意味着您必须更新任何绑定才能使用data.userPhone()

这可能比使用手表更糟糕,因为在每个摘要中都会调用该函数。

在不知道selectedUser如何更新的情况下,很难建议最佳方式,因为大多数事情都取决于它。

答案 1 :(得分:2)

想象一下,你有这样的数据:

  $scope.data = {};
  //set the data
  $scope.data= [{
    id: 1,
    name: "cyril",
    phone: "1234567"
  }, {
    id: 2,
    name: "josh",
    phone: "1237"
  }, {
    id: 3,
    name: "sim",
    phone: "4567"
  }];
  //selected hold the object that is selected in the selectbox.
  $scope.selected = $scope.data[0];

您的HTML将如下所示,所以现在当您从列表中选择新用户时,它将在模型selectedItem中更新,selectedItem具有电话号码在它(所以你不需要手表来单独更新电话号码)

 <body ng-controller="MainCtrl">
    <p>selected item is : {{selectedItem}}</p>

    <p> name of selected item is : {{selectedItem.name}} </p>

    <select ng-model="selectedItem" ng-options="item.name for item in items track by item.id"></select>

  </body>

工作示例here