2016-11-08 2 views
0

Я хочу перекрыть свойство объекта. Кроме того, должно быть двустороннее связывание данных, так что любое изменение также изменит объект.AngularJS: Итерация над свойствами объекта и привязкой в ​​двух направлениях

Оба ключа и значение свойства объекта могут быть изменены из пользовательского интерфейса и должны отражаться в структуре объекта.

Я могу сделать это за ценности объекта с ng-model="contents[index]"

, но как это сделать с помощью ключа свойства объекта, например, интерфейс в объекте изменится, если я изменю его в пользовательском интерфейсе.

$scope.contents = { 
 
      "interface": "GigabitEthernet", 
 
      "interfaceNumber": "1", 
 
      "BGPneighborIp": "00.0.112.499", 
 
      "BGPremoteAs_[1]": "701", 
 
      "BGPneighborIp_[2]": "8.3.112.170", 
 
      "BGPremoteAs_[2]": "702" 
 
     }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<tbody> 
 
<tr ng-repeat="(index, p1) in contents"> 
 
<td> 
 
<input class="form-control" type="text" ng-model="index"> 
 
</td> 
 
<td> 
 
<input class="form-control" type="text" ng-model="contents[index]"> 
 
</td> 
 
</tr> 
 
</tbody>

+0

Может быть, [это SO] (http://stackoverflow.com/questions/23643592/how-to -bind-angularjs-objects-to-their-keys-and-values). Консенсуса в том, что вы не можете. Я бы предложил изменить вашу структуру данных, поэтому изменение ключа объекта не требуется. – ste2425

+0

@ ste2425 - У меня есть структура JSON. согласно дизайну. Мне нужно зациклиться на разных объектах и ​​показать его в пользовательском интерфейсе. ключ и значения могут быть изменены из пользовательского интерфейса и должны отражать JSON позади. Для изменения значений нет сохранения или отправки, поэтому требуется двусторонняя привязка. преобразование объекта в массив потребует дополнительных усилий, чтобы снова объединить его в JSON. – Mudit

ответ

1

Попробуйте это решение:

angular.module('app',[]).controller('test',['$scope', function($scope){ 
 
    $scope.contents = {  
 
      "interface": "GigabitEthernet", 
 
      "interfaceNumber": "1", 
 
      "BGPneighborIp": "00.0.112.499", 
 
      "BGPremoteAs_[1]": "701", 
 
      "BGPneighborIp_[2]": "8.3.112.170", 
 
      "BGPremoteAs_[2]": "702" 
 
    }; 
 

 
    $scope.arr = []; 
 
    for(var prop in $scope.contents) 
 
     $scope.arr.push({oldKey:prop, newKey:prop}); 
 

 
    $scope.change = function(item){         
 
     $scope.contents[item.newKey] = $scope.contents[item.oldKey];   
 
     delete $scope.contents[item.oldKey]; 
 
     item.oldKey = item.newKey; 
 
    } 
 
}])
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app='app' ng-controller='test'> 
 
    <input ng-repeat-start='item in arr' type='text' ng-model="item.newKey" ng-change='change(item)'> 
 
    <input type='text' ng-model="contents[item.oldKey]" > 
 
    <br ng-repeat-end> 
 
    <p>{{contents|json}}</p> 
 
</div>

+0

Он работает, но клавиши меняют положение в соответствии с порядком сортировки. например, если вы измените BGPneighborIp на aBGPneighborIp, он станет 4-м элементом. Что плохого с точки зрения пользовательского интерфейса, если у нас есть огромная таблица. есть ли какое-либо решение, кроме сортировки? – Mudit

+1

В этом случае вы должны иметь проекцию/копию '$ scope.contents', например массив, такой как' [{key: 'interface', value: 'GigabitEthernet'} ,,,] 'и отражать любые изменения в эта копия в '$ scope.contents' и наоборот –

+0

даже у нас есть копия, ng-repeat на объекте будет поддерживать порядок сортировки. Смена любой клавиши изменит ее положение. – Mudit