Javascript 角度:为ng模型提供方法

Javascript 角度:为ng模型提供方法,javascript,angularjs,Javascript,Angularjs,我最近开始学习角运动,作为一种学习练习 我想将一个方法传递给ng model,或者传递一个可能计算为1的表达式 在这个提琴中,您将看到我已将字段硬编码为ng model=“record.internal[0].text”,它可以工作,现在的问题是,我想用运行时返回的内容替换硬编码的零,由一个标准选择,比如id=1 我的HTML代码: <div ng-controller="MainController" ng-app> <div ng-repeat="record in

我最近开始学习角运动,作为一种学习练习

我想将一个方法传递给
ng model
,或者传递一个可能计算为1的表达式

在这个提琴中,您将看到我已将字段硬编码为
ng model=“record.internal[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/>
我尝试按照放置
ng model=“getText(record)”
,但没有成功,另一次搜索发现了这一点,这对我同样没有帮助


非常感谢您的帮助。

您传递到ng模型中的任何内容都将根据范围作为角度表达式进行评估。这意味着
record.internal[0].text
被计算为
$scope.record.internal[0].text
,然后使用该表达式的结果。使用
getText(record)
时,angular计算
$scope.getText(record)
,ng模型可以访问此计算的结果。请记住,ng模型不会评估此函数调用的结果


您的问题是,返回的结果是一个角度表达式字符串,但从未对其求值,因此ng模型得到了一个它无法使用的字符串。有很多方法可以重新设计代码来处理这个问题,但最简单的(可能不是最好的)方法是使用类似nginit的东西来获得函数调用的结果,然后将结果插入到ng模型中。查看此提琴以获得一个快速示例

我认为
ng model=“{{{scopefunctionthattreturnsastring()}}”
不应该起作用。你有这样的例子吗?@Langdon你是对的。谢谢你抓住了!我会修正我的答案。谢谢你的解决方案,如果没有更好的办法,我可能会选择这个。如果您不介意解释的话,Angular文档说,
ngModel–{string}–数据绑定到的可赋值角度表达式。
,如果不是我所做的,这意味着什么?我根本无法在
ng model
指令中使用任何函数。
ng model
正在寻找用于双向数据绑定的实际角度表达式。您给它的函数返回了一个有效的表达式,但是
ng model
无法调用函数来获取表达式。它只需要表达式。感谢您的耐心和解释。您的
getText
函数中有一个bug
for/in
循环在JavaScript中的工作方式与此不同。您需要将if语句更改为
if(record.internal[nested].id==1{
。无论如何,这都不能解决您的整个问题。最好描述您正在尝试执行的操作,而不是如何执行。例如,如果您只是尝试让用户编辑[0]或[1]单击编辑按钮后,在Angular中,最好/更容易显示/隐藏单独的字段。感谢@Langdon发现这个错误,我通常避免使用
for/in
循环,因此我有点生疏。我正在遵循Dan Wahlin的Angular JS指南,我正在尝试重新制作演示中引用的客户应用程序w当我想到尝试这个,因为它应该按照我引用的链接工作。我想这一定是我做错了什么。我现在只是在探索指令,这就是问题的来源。:)
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++;
        }
    };