2015-12-16 3 views
1

У меня есть странная проблема с динамическим связыванием модели в Angular JS.Модель в динамическом повторении

<tr ng-repeat="i in [].constructor(5) track by $index"> 
    <td ng-repeat="column in columns"> 
    <input type="text" ng-model="column.defaults[i]" class="form-control"> 
    </td> 
</tr> 

Я определяю столбцы с помощью:

$scope.addColumn = function() { 
    if(!$scope.field_column_name) return; 

    if(!$scope.columns) { 
     $scope.columns = [] 
    } 
    $scope.columns.push({ 
     name: $scope.field_column_name, 
     defaults: $scope.field_column_defaults 
    }); 
    $scope.field_column_name = $scope.field_column_default = undefined; 
    }; 

Моя цель создать входы для всех его для хранения данных, добавленных пользователем. Проблема в том, что все входы выглядят, если они были одной и той же моделью (добавленная стоимость в одном из них также отображается и на других входах). Зачем?

JSFiddle: http://jsfiddle.net/tz6fsz1o/5/

+0

Покажите, как вы определяете столбцы в вашем контроллере – suvroc

+0

@suvroc Я добавил метод – Siper

+0

Я попытался воспроизвести вашу ошибку, но безуспешно: http://jsfiddle.net/tz6fsz1o/1/ попробуйте сделать это в JsFiddle – suvroc

ответ

0

Вы ошибку при создании rows_array

Попробуйте http://jsfiddle.net/tz6fsz1o/6/

$scope.$watch('rows', function(){ 
    $scope.rows_array = []; 
    for(var i=0;i<$scope.rows;i++){ 
     $scope.rows_array.push(i); 
    } 
    }, true); 
+0

Вот что я сделал и отлично работает :) Я просто использовал это вместо цикла: 'Array.apply (null, {length: $ scope.rows}). Map (Number.call, Number);' – Siper

+0

Да , хорошая идея. Я использую цикл, чтобы показать, что вы должны сделать простым способом – suvroc

1

Я думаю, что это должно быть так:

<tr ng-repeat="i in [].constructor(5)" ng-init="outerIndex = $index"> 
    <td ng-repeat="column in columns"> 
     <input type="text" ng-model="columns[$index].defaults[outerIndex]" class="form-control"> 
    </td> 
</tr> 

Обратите внимание, как вам нужно сохранить внешний контур $index в переменную-помощника для того, чтобы получить доступ к нему во внутреннем цикле.

Демо:http://jsfiddle.net/tz6fsz1o/7/

0

Вы связывания каждое поле на ng-model="column.defaults[i]", это означает, что каждое поле присутствует в columns массив будет привязан к тому же свойству модели. .. например: как column.foo и column.bar связывается с columnt.default[i] ...

Вы можете исправить это связыванием текстового поля переменной column, например:

<td ng-repeat="column in columns"> 
 
     <input type="text" ng-model="column.foo" class="form-control"> 
 
</td>

Смежные вопросы