1

我是 Knockout 的新手,我正在尝试在显示系统用户和每个用户拥有的角色的页面上使用它。

数据在observableArray用户中。用户对象有一个角色属性,它是另一个observableArray. 第二个数组包含每个角色的对象,具有 ID 和布尔“授予”属性。

我希望能够以特定角色展示所有用户,因此每个角色都有一个复选框 - 当检查其中一个角色时,列表应显示具有该角色的用户。

我遇到的问题是按角色过滤 1,000 个左右的用户需要几秒钟的时间。按名称中的文本过滤非常快(几毫秒),但按角色过滤则不然。我已经放入了一些计时代码,问题是我用来检查用户是否具有选定角色的方法,所以我只是想知道是否有更好的方法,也许使用一些 Knockout魔法。

下面是我用来进行过滤的视图模型上的 ko.computed。结果表绑定到这个函数。

self.filteredUsers = ko.computed(function () {

    var textFilter = self.filter();          // this is an observable bound to a text field
    var checkedRoles = self.selectedRoles(); // this is a computed, which returns an array of checked roles

    return ko.utils.arrayFilter(self.users(), function (user) {

        var match = true;

        if (user.displayName.toLowerCase().indexOf(textFilter.toLowerCase()) == -1) {
            match = false;
        }

        // for each ticked role, check the user has the role
        for (var i = 0; i < checkedRoles.length; i++) {
            var roleMatch = false;
            for (var j = 0; j < user.roles().length; j++) {
                if (user.roles()[j].roleId === checkedRoles[i].roleId && user.roles()[j].granted()) {
                    roleMatch = true;
                    break;
                }
            }
            if (!roleMatch) {
                match = false;
            }
        }

        return match;
    });
});
4

1 回答 1

2

我认为一个好的优化是grantedRoles在你的用户对象上创建一个计算。此计算将返回一个您可以用作索引的对象,将包含由角色的唯一标识符作为键的属性,并且仅包含被授予的角色。

然后在 中filteredUsers,您将grantedRoles针对每个选中的角色检查对象,而不是循环遍历user.roles()每个选中的角色。

于 2012-12-14T14:30:12.023 回答