AngularJS: ng-repeat с ключом - обновляющий объект
Я делаю рендеринг ключа: массив объектов значения с ng-repeat следующим образом:
<div ng-controller="mainCtrl">
<div ng-repeat="record in records">
<div ng-repeat="(key, value) in record">
<input ng-model="key" />: <input ng-model="value" />
</div>
</div>
</div>
JS:
var mainCtrl = function($scope){
$scope.records = [
{'key1':'val1'},
{'key2':'val2'}
];
}
Проблема в том, что ключи и значения не могут обновляться через теги ввода. По какой-то причине он становится одним из способов привязки после повторения итерации ng-repeat (ключ, значение).
Fiddle: http://jsfiddle.net/BSbqU/1/
Как я могу сделать это двусторонней привязкой? Или мне нужно подойти к этой проблеме иначе, чем вложенное ng-repeat?
Ответы
Ответ 1
<div ng-controller="mainCtrl">
<div ng-repeat="record in records">
<input ng-model="record.name" />: <input ng-model="record.value" />
</div>
</div>
И JS:
var myApp = angular.module('myApp', []);
var mainCtrl = function($scope){
$scope.records = [
{'name':'key1','value':'val1'},
{'name':'key2', 'value':'val2'}
];
}
Ответ 2
Эта опция работает с объектом:
<div ng-controller="mainCtrl">
<div ng-repeat="record in records">
<div ng-repeat="(key, value) in record">
<input ng-model="key" />: <input ng-model="record[key]" />
</div>
</div>
</div>
Не блестящий, но он работает.
Ответ 3
После того, как я почесал голову до костей, я нашел способ обновить имена ключей объектов.
Он немного искажен, но он работает для меня.
заменить
<input ng-model="key" />
с
<input type="text" ng-model="key" ng-change="update_key(record,key,$index)" line-key/>
вам понадобится директива lineKey, чтобы сосредоточиться на вашем вводе
var app = angular.module('myApp',[]);
var focus_key=-1;
app.directive('lineKey', function () {
return function (scope, element, attrs) {
if(focus_key==scope[attrs.ngModel]){
focus_key=-1;
element[0].focus();
}
};
});
наконец, добавьте метод update_key 'к вашему контроллеру
app.controller('mainCtrl',['$scope'],function($scope){
$scope.records = [
{'key1':'val1'},
{'key2':'val2'}
];
$scope.update_key=function(obj,new_key,id){
var keys = Object.keys(obj);
var values = Object.values(obj);
var old_key = keys[id];
if(keys.indexOf(new_key)==-1&&new_key.length>0){
// clear ...
for(var i=0,key;key=keys[i];i++){ delete obj[key]; }
keys[id]=new_key;//... change key value ...
focus_key=new_key;//... notify to keep focus on modifyed input ...
// ... and refill to preserve the position in the object list
for(var i=0,key;key=keys[i];i++){ obj[key]=values[i]; }
}
};
}