发布ko邮箱值时执行查找

时间:2014-07-31 21:42:21

标签: knockout.js knockout-postbox

我开始写这个问题想要知道当一个observable属性被另一个视图模型改变时如何触发查找函数,现在我正在质疑我是如何处理这个问题的。无论如何,这是我的场景:

我的页面上有一个项目网格。用户单击按钮编辑项目,我们将显示一个编辑弹出窗口,其中包含所有原始数据以及有关该主要网格对象中不存在的记录的详细数据。

在编辑窗口中,我有一个单独的observable用于数据的“工作副本”。当用户通过单击保存按钮提交更改时,我的计划是将其复制到原始对象,以便更改反映在网格中。

现在我正在使用ko.postbox库在两个视图模型之间进行通信。两者都包含一个observable来存储已选择的项目并使用“syncWith”保持同步。

以下是对它的看法:

function MainVM()
{
    self = this;
    this.Item = ko.observable().syncWith("GridItem");

    this.Edit = function (item)
    {
         self.Item(item);
    }
}

function EditVM()
{
    self = this;

    this.SelectedItem = ko.observable().syncWith("GridItem");
    this.WorkingItem = ko.observable();

    this.RetrieveGridItemDetails = function (id)
    {
        // Ajax lookup to populate WorkingItem
    }
}

当用户点击编辑某个项目时......我希望将所选项目发布到编辑窗口vm(已经发生了syncWith),然后还执行AJAX查找以获取有关的其他信息该项目(没有想法如何做到这一点)。

我已经看过手动订阅该特定的observable,以及在编辑窗口viewmodel中使用计算的observable来调用单独的查找函数,但到目前为止我一直无法弄清楚工作解决方案:(

我是否按照当前的思路走错了路,或者有人知道如何进行查找吗?

1 个答案:

答案 0 :(得分:0)

我仍然无法使用syncWith使一切正常工作,但是我已经能够以下列方式使用subscribeTo进行查找调用:

SelectedItem = ko.observable<Item>().subscribeTo("GridItem", true, (item) => {
    if (item != null) {

        this.RetrieveItem(item.HeaderID());

        return item;
    }
    return new Item();
});

*注意:这是Typescript Implementation

现在这将允许我继续,当我来到那个部分时,我将需要解决任何同步问题回到主vm。