【问题标题】:Using functions in Ng-Repeat在 Ng-Repeat 中使用函数
【发布时间】:2014-08-20 15:49:09
【问题描述】:

我有两个对象数组。一个数组是权限组对象列表,另一个是用户组列表。我试图弄清楚如何将组所有者(即 70)与匹配 ID 的用户列表进行比较。

Groups 数组 (ReportModel.report) 的结构如下:

[{ 
name: Admin,
id: 71,
description: Important Group,
owner: 70,
ownerIsUser: True
 }]

用户数组(ReportModel.users)的结构如下:

[{ 
name: All Users (windows),
id: 70,
domain: c:0!.s|windows,
email: ,
isAdmin: False
 }]

使用组对象数组,我在表格中显示所有组。

HTML:

<tr ng-repeat="group in ReportModel.report" on-finish-render
    <td>{{group.id}}</td>
    <td>{{group.description}}</td>
    <td>{{group.owner}}</td>
    <td><td>{{getOwner(group.owner)}}</td></td> //I'm trying to get this cell to display "All Users (windows)"
    <td>{{group.ownerIsUser}}</td>
</tr>

我找到了一个函数,它执行 ID 查找并返回正确的用户对象,我可以从中提取名称,但我不知道如何在 ng-repeat 中的视图中调用此函数并返回正确的名字

这是我的controller

function loadUsers(){
    UserService.loadUsers().then(function (data){
        console.log('getting users');
        $scope.ReportModel.users = data;            })
}


function findById (source, id) {
    return source.filter(function( obj ) {
        // coerce both obj.id and id to numbers 
        // for val & type comparison
        return +obj.id === +id;
    })[ 0 ];
}

$scope.getOwner = function (ownerID) {
    console.log('get owner called', ownerID);
    var owner = findById($scope.ReportModel.users, ownerID);
    console.log(owner.name);
    return owner.name;
}

【问题讨论】:

  • 你可以直接调用那个函数&lt;td&gt;{{getUsers(group.owner)}}&lt;/td&gt;
  • 我试过你的建议,但我得到一个插值错误jsfiddle.net/uyy0kfjp
  • @PSL 您的解决方案对我有用。我只需要确保在运行 ng-repeat 之前填充了所有用户。所以这是一个时间问题。谢谢你的帮助。如果您将其作为答案提交,我可以将其作为解决方案。谢谢。
  • 肯定添加为答案。谢谢

标签: javascript html arrays angularjs angularjs-ng-repeat


【解决方案1】:

只是让我的评论成为答案。

您可以使用任何可以针对绑定中的范围进行验证的表达式。所以在你的情况下你可以这样做:-

<td><td>{{getOwner(group.owner)}}</td></td> 

来自迭代组的group.owner 并从范围调用getOwner 函数。

在你的范围内:-

$scope.getOwner = function (owner) {
    //Your logic that returns the owner.
}

【讨论】:

    【解决方案2】:

    您在控制器中使用 finById 函数的方法是正确的。您无法从 html 调用它的原因是该方法未绑定到您的范围。将控制器中的函数定义更改为:

    $scope.findById = function(source, id) {
        return source.filter(function( obj ) {
            // coerce both obj.id and id to numbers 
            // for val & type comparison
            return +obj.id === +id;
        })[ 0 ];
    }
    

    【讨论】:

    • 我对控制器进行了一些更改,并添加了另一个函数来调用 findById,因此视图不会直接使用它。但我收到此错误:错误:[$interpolate:interr] 无法插入:{{getOwner(group.owner)}} TypeError:无法读取未定义的属性“名称”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多