Knockout.js durandal viewmodel的新实例仍反映以前的值
在使用durandal尝试一个稍微复杂的合成场景时,我遇到了一个奇怪的问题 我想动态地组合表中每个单元格的内容。例如,我有以下文件: welcome.html=>包含动态呈现html表的代码Knockout.js durandal viewmodel的新实例仍反映以前的值,knockout.js,durandal-2.0,Knockout.js,Durandal 2.0,在使用durandal尝试一个稍微复杂的合成场景时,我遇到了一个奇怪的问题 我想动态地组合表中每个单元格的内容。例如,我有以下文件: welcome.html=>包含动态呈现html表的代码 <table> <thead> <tr data-bind="foreach: columnNames"> <th><span data-bind="text: $data"></span>
<table>
<thead>
<tr data-bind="foreach: columnNames">
<th><span data-bind="text: $data"></span>
</th>
</tr>
</thead>
<tbody data-bind="foreach: items">
<tr data-bind="foreach: $parent.columnNames">
<!-- <td data-bind="text: $parent[$data]"></td>-->
<td data-bind="compose: { model: $root.activeView($index), activationData: $root.activationData($parentContext.$index), cacheViews: false }"></td>
</tr>
</tbody>
</table>
cell-1.html=>要为第一列显示的视图
<span data-bind="text : Name"></span>
同样,cell-2的视图和视图模型
我面临的问题是,即使合成工作正常,并且对cell-1.js调用了两次activate函数(每行调用一次),可观察的name
的值将包含前面的值(即,当它试图将其设置为“Morgan”时,该值将是“John”)。这很奇怪,因为cell-1.js返回一个构造函数,因此durandal应该创建视图模型的另一个实例。总之,这将导致两行包含相同的数据
我肯定有一些次要的东西我必须调整才能让它发挥作用,但我所有的努力都白费了
任何帮助都将不胜感激。问题是您已经在
cell-1.js
中声明了模块级的模型
和名称
变量
因此,即使返回的构造函数调用了两次,模块本身也只加载了一次,因此viewmodels共享相同的状态
要解决此问题,只需将变量移动到ctr
:
define(['knockout'], function (ko) {
var ctr = function () {
var model = null;
var name = ko.observable();
this.Name = name;
this.activate = function (modelObject) {
model = modelObject;
name(model.Name);
};
};
return ctr;
});
伟大的谢谢你抓住了!
define(['knockout'], function (ko) {
var model = null;
var name = ko.observable();
var ctr = function () {
this.Name = name;
this.activate = function (modelObject) {
model = modelObject;
name(model.Name);
};
};
return ctr;
});
define(['knockout'], function (ko) {
var ctr = function () {
var model = null;
var name = ko.observable();
this.Name = name;
this.activate = function (modelObject) {
model = modelObject;
name(model.Name);
};
};
return ctr;
});