Angular:为ng-model提供方法

时间:2013-07-22 17:21:45

标签: javascript angularjs

我最近接受了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++;
        }
    };

我已尝试根据https://groups.google.com/forum/#!topic/angular/Pef6LY2rT7g放置ng-model="getText(record)"但没有成功,另一次搜索显示https://github.com/angular/angular.js/pull/1328这对我同样无益。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:11)

您传入ng-model的任何内容都将被评估为针对范围的角度表达式。这意味着record.inner[0].text被评估为$scope.record.inner[0].text,然后使用该表达式的结果。当您使用getText(record)时,angular会对$scope.getText(record)进行评估,并且ng-model可以访问此评估的结果。请记住,ng-model不会评估此函数调用的结果。

您的问题是您将结果作为角度表达式字符串返回,但从未对其进行评估,因此为ng-model提供了一个不能使用的字符串。有很多方法可以重新设计代码来处理这个问题,但简单(也可能不是最好的)方法是使用类似ng-init的方法来获取函数调用的结果,然后将结果插入到ng-模型。请参阅此小提琴,以获取快速示例http://jsfiddle.net/z5z9s/