Knockout.js durandal viewmodel的新实例仍反映以前的值

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>

在使用durandal尝试一个稍微复杂的合成场景时,我遇到了一个奇怪的问题

我想动态地组合表中每个单元格的内容。例如,我有以下文件:

welcome.html=>包含动态呈现html表的代码

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