Я пытаюсь добавить объект в ng-repeat, как показано:
<div ng-controller="filtersController as datas">
<table>
<tr>
<th>Names</th>
<th>nos</th>
</tr>
<tr ng-repeat="data in datas.dataset">
<td>{{data.name}}</td>
<td>{{data.no}}</td>
</tr>
</table>
<input type="text" ng-model="models.name" placeholder="enter name" />
<input type="number" ng-model="models.no" placeholder="enter number" />
<input type="button" ng-click="datas.add(models)" value="click me!!!!" />
</div>
Соответствующий javascript:
app.controller('filtersController', ['$scope', function ($scope) {
this.dataset = [{ name: "Vishesh", no: 1 },
{ name: "pqrst", no: 2 },
{ name: "uvwxyz", no: 3 }]
this.add = function (model) {
this.dataset.push(model);
$scope.$apply();
}}]);
Проблема:
когда я пытаюсь добавить новые записи с помощью текстовых полей, он добавит первую запись, но после этого я не смогу добавить в нее больше записей, а также добавлена последняя добавленная запись, когда значения в текстовых полях меняются. Почему это?
Также, если я изменяю javascript следующим образом:
app.controller('filtersController', ['$scope', function ($scope) {
this.dataset = [{ name: "Vishesh", no: 1 },
{ name: "pqrst", no: 2 },
{ name: "uvwxyz", no: 3 }]
this.add = function (names, nos) {
this.dataset.push({ name: names, no: nos });
$scope.$apply();
}}]);
и HTML:
<input type="text" ng-model="name1" placeholder="enter name" />
<input type="number" ng-model="no1" placeholder="enter number" />
<input type="button" ng-click="datas.add(name1,no1)" value="click me!!!!" />
он добавляет столько записей, которые я хочу, и работает так, как ожидалось.
Что не так с первым подходом?
ng-model="models.name"
создает объект в области с именем "models". Изменения в models.name
и models.no
будут изменять значения внутри этого объекта, но он все еще является единственным объектом - поэтому datas.add(model)
завершает работу, ссылаясь на этот единственный объект на this.dataset
. Дальнейшие изменения в model
изменят исходный объект, который уже находится в this.dataset
, потому что все ссылается на тот же объект.
Ваш другой подход работает правильно, потому что вы используете отдельные примитивы для ng-model="name1"
и ng-model="no1"
. Здесь каждый раз, когда datas.add(name1,no1)
запускается, он this.dataset
вновь созданный объект на this.dataset
. Дальнейшие изменения в name1
и no1
теперь не будут изменять старые данные, потому что они являются примитивами, а не ссылками на объекты, и каждый раз, когда вы нажимаете на this.dataset
вы this.dataset
новый объект из этих примитивов.
Когда вы нажимаете объект модели, который вы передаете методу add() в массив, вы фактически нажимаете ссылку на этот объект, и теперь Angular будет использовать двустороннюю привязку данных к нему. Что вам нужно сделать, это сначала скопировать модель, чтобы она отделяла ее от директив ng-model в вашем HTML.
this.add = function(model) {
var newModel = angular.copy(model);
this.dataset.push(newModel);
}
Здесь Plunker: http://plnkr.co/edit/SdtSesYxb828yJyDFwws?p=preview