Угловая передача заданного значения ввода
У меня проблемы с отправкой предустановленного значения. Если я введу ввод, он будет отправлен нормально. если нет, показанное значение не определено. Если я установлю массив в некоторые значения в начале перед контроллером, он будет показан на странице и будет отправлен. Если я просто инициализирую массив, то заполняю его динамически, он представляет пустой массив, а не то, что показано на странице.
Я знаю, что это какая-то странная проблема с Angular $scope, но я несколько дней пытался отлаживать безуспешно. Кто-нибудь может найти проблему?
<button type="button" class="btn btn-primary" form="commandForm" ng-click="submitCmd(mycommand)">
<tr ng-repeat="param in paramList">
<td></td>
<td><input type="text" id="paramName"
class="hidden_text"
ng-model="mycommand.paramNames[$index]"
ng-readonly="false"
ng-value="param.name"
ng-disabled="!checked" />
</td>
app.controller('commandController', function($scope, $http, $location,
Restangular, $q) {
$scope.mycommand = {};
$scope.mycommand.paramNames = []; ///IF I SET =["one","two"] then it works ( statically but I cannot dynamically set the values )
/* This list below gets fed from the backend successfully and displays
correctly on the page
$scope.paramList = {};
// в методе ниже mycommand имеет пустой массив paramNames, как описано выше...
$scope.submitCmd = function(mycommand) {
/*
* get fresh data sent from the page
*/
console.log(">>>>>>>>>LOOK>>>>>>>SUBMITCMD(mycommand): "
+ angular.toJson(mycommand, 2));
Я попытался взять $scope.mycommand вместо передачи модели mycommand со страницы. Те же результаты.
Я считаю, что моя проблема связана со следующим...
(любая идея относительно того, как я мог бы просто привязать объект ng-model, чтобы он имел ту же область видимости, когда я получу его в контроллере (со страницы)?
Из угловой документации:
Для каждого элемента / итерации ng-repeat создает новую область видимости, которая прототипно наследуется от родительской области, но также назначает значение элемента новому свойству в новой дочерней области. (Имя нового свойства - это имя переменной цикла.) Вот каков исходный код Angular для ng-repeat:
childScope = scope. $ new (); // дочерняя область прототипически наследуется от родительской области...
childScope [valueIdent] = значение; // создает новое свойство childScope
Если элемент является примитивом (как в myArrayOfPrimitives), по сути, копия значения присваивается новому дочернему свойству области. Изменение значения свойства дочерней области (т. Е. Использование ng-модели, следовательно, свойства дочерней области num) не изменяет массив, на который ссылается родительская область. Таким образом, в первом выше ng-повторе каждая дочерняя область получает свойство num, которое не зависит от массива myArrayOfPrimitives:
ng-repeat примитив
Это ng-repeat не будет работать (как вы хотите / ожидаете). В Angular 1.0.2 или более ранней версии ввод в текстовые поля изменяет значения в серых полях, которые видны только в дочерних областях. В Angular 1.0.3+, ввод в текстовые поля не имеет никакого эффекта. (См. Объяснение Артема о том, почему в Stackru.) Мы хотим, чтобы входные данные влияли на массив myArrayOfPrimitives, а не на дочернее примитивное свойство области действия. Для этого нам нужно изменить модель на массив объектов.
Таким образом, если элемент является объектом, ссылка на исходный объект (не на копию) назначается новому дочернему свойству области. Изменение значения свойства дочерней области (т. Е. Использование ng-модели, следовательно, obj.num) изменяет объект, на который ссылается родительская область. Итак, во втором нг-повторе выше мы имеем:
нг-повторный объект
Это работает как ожидалось. Ввод в текстовые поля изменяет значения в серых полях, которые видны как для дочерней, так и для родительской областей.