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/