Knockout.js 两个可观察的耳环不';t使用嵌套的viewModel在同一页面中协同工作

Knockout.js 两个可观察的耳环不';t使用嵌套的viewModel在同一页面中协同工作,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,我有这个模型: 视图模型 然后我用这种方式调用Web服务: Ajax调用 并以这种方式映射结果: 映射 另一个数组也是如此 下面是我的数据绑定: 数据绑定 西蒙·沃纳·汉森 swh002 西蒙·沃纳·汉森 swh002 如果我评论其中一个,另一个就可以了,但是如果它们在同一页上,那么这个表就是空的,没有错误或者什么都没有 a如何处理模型的上下文?我注意到您在映射代码中所做的操作 viewModel.sitesTable = ko.observableArray(itemRow); 我想知道

我有这个模型:

视图模型 然后我用这种方式调用Web服务:

Ajax调用 并以这种方式映射结果:

映射 另一个数组也是如此

下面是我的数据绑定:

数据绑定

西蒙·沃纳·汉森
swh002
西蒙·沃纳·汉森
swh002
如果我评论其中一个,另一个就可以了,但是如果它们在同一页上,那么这个表就是空的,没有错误或者什么都没有


a如何处理模型的上下文?

我注意到您在映射代码中所做的操作

viewModel.sitesTable = ko.observableArray(itemRow);
我想知道你是否想要

viewModel.sitesTable(itemRow);

一旦在初始化过程中创建了knockout observate或observatarray,就要小心不要用另一个新的observatarray覆盖它们,尤其是调用ko.applyBindings()之后

我认为最好用一个例子来说明这一点

//Initialize my view model
var myOriginalObservable = ko.observableArray([initialValue]);

var viewModel = {
    modelProperty : myOriginalObservable
}

//Call applyBindings
ko.applyBindings(viewModel);

//In some other function, I reset viewModel.modelPropert = ko.observableArray()
var myNewObservable = ko.observableArray([newValue]);

viewModel.modelProperty = myNewObservable;
调用applyBindings后,其他一些操作会将我的viewModel属性设置为一个新的observable,而不仅仅是更改现有observable中的值。我在初始化中创建的可观察对象(myOriginalObservable)仍然存在,并且我的UI仍然绑定到它,但是当我更改viewModel.modelProperty指向的对象(myNewObservable)时,我丢失了对它的引用

我想这可能是您遇到的问题。

我发现了问题

我在ajax调用的.always函数上应用了绑定ko.applyBinding,但是因为两个不同的原因,我调用了两次服务,绑定被应用了两次

我不知道为什么,但出于某种原因,这阻止了两个不同的ObservaterRay在同一个模型中协同工作。所以这是一个解决方案,但它不能解释为什么会发生这种情况


我刚刚在创建模型后将绑定移到函数外部。

如果我像你在开始时说的那样(viewModel.sitesTable(itemRow);)它对我不起作用,我知道这是正确的方法,但是我使用它,我的表中没有显示任何内容。然后我按照你在文章第二部分中说的做了,但是代码和我的代码一样,没有区别。我很高兴你发现了这个问题,莫里齐奥。
    <table id="tableDocs">  
        <tbody data-bind="foreach: documentsTable" >
        <tr>
            <td data-bind="text: nameCol">Simon Werner Hansen</td>
            <td data-bind="text: pagesCol">swh002</td>
        </tr>
        </tbody>
    </table>


    <table id="tableSites">  
        <tbody data-bind="foreach: documentsTable" >
        <tr>
            <td data-bind="text: lastCol">Simon Werner Hansen</td>
            <td data-bind="text: editedCol">swh002</td>
        </tr>
        </tbody>
    </table>
viewModel.sitesTable = ko.observableArray(itemRow);
viewModel.sitesTable(itemRow);
//Initialize my view model
var myOriginalObservable = ko.observableArray([initialValue]);

var viewModel = {
    modelProperty : myOriginalObservable
}

//Call applyBindings
ko.applyBindings(viewModel);

//In some other function, I reset viewModel.modelPropert = ko.observableArray()
var myNewObservable = ko.observableArray([newValue]);

viewModel.modelProperty = myNewObservable;