Angular: предоставление методов для ng-model
Недавно я рассмотрел Angular как учебное упражнение.
Я хотел бы передать метод ng-model
или выражение, которое может быть оценено одним.
В этой скрипте http://jsfiddle.net/C4aGk/ вы увидите, что я жестко закодировал поле как ng-model="record.inner[0].text"
, и он работает, теперь Дело в том, что я хотел бы заменить закодированный нуль чем-то, что возвращается во время выполнения, выбранным по критерию id = 1
.
Мой HTML-код:
<div ng-controller="MainController" ng-app>
<div ng-repeat="record in records">
<input ng-model="record.inner[0].text"> <span>{{record.outer}}</span>
<div ng-repeat="nested in record.inner">{{nested.id}} - {{nested.text}}</div>
<hr />
</div>
</div>
<br/>
и соответствующие js:
function MainController($scope) {
$scope.records = [{
outer: "Hello",
inner: [{
id: 1,
text: "Angular"
}, {
id: 2,
text: "jQuery"
}]
}, {
outer: "World",
inner: [{
id: 1,
text: "Node.js"
}, {
id: 2,
text: "Underscore.js"
}]
}];
$scope.getText = function (record) {
var index = 0;
for (nested in record.inner) {
if (nested.id === 1) {
return "record.inner[" + index + "].text";
}
index++;
}
};
Я пробовал разместить ng-model="getText(record)"
в соответствии с https://groups.google.com/forum/#!topic/angular/Pef6LY2rT7g без успеха, а другой поиск показал это https://github.com/angular/angular.js/pull/1328, что для меня одинаково бесполезно.
Любая помощь будет высоко оценена.
Ответы
Ответ 1
Все, что вы передаете в ng-модель, оценивается как выражение angular против области. Это означает, что record.inner[0].text
оценивается как $scope.record.inner[0].text
, а затем используется результат этого выражения. Когда вы используете getText(record)
, angular оценивает $scope.getText(record)
, а ng-model получает доступ к результатам этой оценки. Имейте в виду, что ng-модель не оценивает результат этого вызова функции.
Ваша проблема заключается в том, что вы возвращаете результат как строку выражения angular, но никогда не оцениваете его, поэтому ng-model получает строку, которую она не может использовать. Существует множество способов перепроектировать ваш код, чтобы справиться с этим, но простой (и, вероятно, не самый лучший) способ - использовать что-то вроде ng-init, чтобы получить результат вызова функции, а затем вставить этот результат в ng- модель. См. Эту скрипту для быстрого примера http://jsfiddle.net/z5z9s/