0

我有下一个模型wirt子数组

<!-- ko foreach: {data: userAdminView.viewRoles, as: 'rrole'} -->
<tr>                                                    
  <td class="userRolesRoleTitle"><b data-bind="text: rrole.role.name"></b><br/><i data-bind="text: rrole.role.description"></i></td>                                
  <td class="userRolesRoleGroups">
    <!-- ko foreach: {data: rrole.role.groups, as: 'group'} -->
    <div class="usersGroupElement" data-bind="html: group.viewName"></div>
    <!-- /ko -->
    <a class="btn emb green" data-bind="click: userAdminView.addNewGroup,visible:(rrole.role.isNewGroupAccessible) , attr: { value: rrole }"><i class="icon16 plus"></i>add</a>
  </td>
</tr>
<!-- /ko -->

它运行良好,但从业务需要我需要动态更改rrole.role.groups子数组中的数据。我的代码正在工作并执行此操作,我看到在调试模式下数组已更改(添加、删除元素),但仅当 userAdminView.viewRoles数组发生更改时才会更新视图。为什么 knockoutjs 不管理它。我该如何解决?

function userAdminView(user) {
    var self = this;
    self.viewRoles = ko.observableArray([]);
    self.saveNewGroup = function (data, event) {
        var datar = self.viewRoles();
        $.each(datar, function (index, vrole) {
            if (vrole.role.id == self.dialogRole.role.id) {
                var line = {
                    viewName: "<b>" + self.dialogCustomer.name + "</b>",
                    customer: self.dialogCustomer,
                    department: self.dialogDepartment,
                    isEdit: true
                };
                if (vrole.role.groups == null) {
                    vrole.role.groups = [];
                }
                vrole.role.groups.push(line);
            }
        });
    };
}

数据结构:

{
    role: {
        description: role.description,
        id: role.id,
        name: role.name,
        groups: existingGroups,
        isNewGroupAccessible: self.canGrant(role, data.d)
    }
};

谢谢。

4

2 回答 2

1

我们可以看看你的淘汰赛模型吗?子组是 observableArray() 吗?如果不是,它将不会更新。

编辑:

我通常处理子数组的方式是手动映射顶级 observableArray,然后为 subArray 创建第二个 observableArray。ko.utilsKnockout 在我们可以使用的命名空间中有一些方便的实用程序, knockout utils。ko.utils 函数ko.utils.arrayForEach接受一个数组并返回一个数组,并接受一个函数,该函数将被调用 forEach 原始数组中的项目。这是我们可以进行映射的地方。

    var dataFromServer = ko.utils.parseJson(JSONdataFromServer);

    //now that we have a javascript object we can pass that into ko.utils.arrayForEach

    viewModel.viewRoles = ko.utils.arrayForEach(dataFromServer, function(viewRole) {
        var newRole = {
            groups : ko.observableArray(ko.utils.arrayForEach(viewRole.group, function(group) {
                var newGroup = {
                    //map the properties from your JSON group to this object
                };
                return newGroup;
            })),
            //map any other properties from your JSON role to this object
        };
        return newRole;
    });

一旦我们将 JSON 数据作为 javascript 对象,我们就可以将它传递给 ko.utils.arrayForEach。我们将 ko.utils.arrayForEach 传递给 javascript 数组和一个函数,它将为该数组中的每个项目调用一个函数,这是您的角色。第一个函数使用子数组创建一个新的角色对象,该子数组也是一个称为组的 observableArray()。

让我知道是否有任何令人困惑的地方,我可以尝试解释更多。此外,我实际上并没有运行任何此代码,因此可能存在错误。

于 2013-05-30T19:22:24.850 回答
0

role.groups 必须是 ko.observableArray。

这应该适合你:

if (typeof vrole.role.groups !== 'function') {
    vrole.role.groups = ko.observableArray(vrole.role.groups);
}
于 2013-06-03T08:02:11.717 回答