我是 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;
});
});