为什么knockoutjs js不't更新视图,如果一些子数组被改变
Why knockoutjs js doesn't update view in case some sub array is changed
我有next model wirt sub array
<!-- 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 -->
它工作得很好,但从业务需要,我需要在 role.role中动态更改数据。组赋。我的代码正在工作,这样做,我看到数组在调试模式下被改变(添加,删除元素),但视图只有在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)
}
};
谢谢。
我们可以看看你的惊艳模型吗?子组是observableArray()吗?如果不是,它将不会更新。
编辑:我通常处理子数组的方式是手动映射顶级observableArray,然后为子数组创建第二个observableArray。Knockout在ko.utils
名称空间中有一些方便的实用程序,我们可以使用它们,即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数组和一个函数,它将为该数组中的每个项目调用该函数,这些项目是您的角色。第一个函数用子数组创建一个新的Role对象,该子数组也是一个名为groups的observableArray()。
让我知道,如果有任何困惑,我可以试着解释更多。另外,我还没有实际运行这些代码,所以可能会有错误。
角色。
这应该为您工作:
if (typeof vrole.role.groups !== 'function') {
vrole.role.groups = ko.observableArray(vrole.role.groups);
}
相关文章:
- 如果我在jquery移动中使用“onclick”,按钮不会改变颜色
- 这是关于Jquery/JS的,如果我改变元素's HTML-我可以对它执行其他Jquery/JS操作吗
- 如果数据链接值没有'不要改变
- 如果选项值是“改变列表不起作用”;真的”;
- JavaScript 如果不是改变 CSS 的青春期
- 为什么如果带有 innerWidth 的语句不会改变它的行为
- 高位图表:如果可能的话,改变每个单独的图表/标记的大小
- 如何在文本框中检查一个值,如果它没有't改变了3秒钟做某事,否则在3秒钟后再次检查
- 如果选择字段发生更改,Jquery将更改变量值
- 如何更新谷歌地图,如果它的地图画布改变了它的尺寸
- 如果我使用r.js优化我的RequireJS项目,我必须改变路径和依赖配置吗?
- Iframe的高度改变,如果点击
- 改变innerHTML值的Javascript代码如果textlength >250.
- 如果我们创建新的原型属性,对象会改变它的隐藏类吗?
- 如果一个输入单选被选中,改变父元素'的颜色:不能'使它与jQuery工作
- 与多个ckeditor使用checkDirty()提醒用户,如果内容已经改变之前离开页面
- 为什么knockoutjs js不't更新视图,如果一些子数组被改变
- 在Angular和Nodejs应用中,如果我改变了html文件,它也不会更新浏览器
- 不能理解为什么这个函数返回false如果我改变参数值
- Jquery检查选择输入,如果改变条件