【问题标题】:Making knockout subscribers off for a model and turn it on back again关闭某个模型的淘汰订阅者并重新打开它
【发布时间】:2012-08-01 10:25:35
【问题描述】:

我是淘汰赛新手,不知道我这样做是否正确

我有一个购物车编辑器,就像淘汰现场示例一样,除了我想要一个更高级的产品选择器。我的产品实际上有 两种 类型的代码,用户必须能够输入其中一种并在他的购物车上获取产品的完整详细信息。所以我会为每种代码输入两个输入,当用户在其中任何一个输入代码时,我应该进行 ajax 调用并加载产品信息(包括 productId、productName、the_other_code 等)。

我尝试通过订阅 code1 和 code2 来实现这一点——在从服务器获取数据后进行 ajax 调用并设置模型的数据,但它会触发一种递归事件(订阅),从而重复调用 ajax 方法。因此我相信如果可以在SetData 方法期间将淘汰订阅设置为OFF,那么递归行为就不会发生。

function Product(data) 
{
    var self = this;

    self.ProductId = ko.observable();
    self.Code1 = ko.observable();
    self.Code2 = ko.observable();
    self.Title = ko.observable();

    self.SetData = function (itemdata) {
        self.ProductId (itemdata ? itemdata.ProductId : null);
        self.Code1(itemdata ? itemdata.Code1 : null);
        self.Code2(itemdata ? itemdata.Code2 : null);
        self.Title(itemdata ? itemdata.Title : null);
    };

    self.SetData(data);

    self.Code1.subscribe(function (value) 
    {
        var productInfo = Ajax_GetPartDataWithCode1(value);
        self.SetData(productInfo );
    });

    self.Code2.subscribe(function (value) {
        var productInfo = Ajax_GetPartDataWithCode2(value);
        self.SetData(productInfo );
    });
}

任何帮助将不胜感激!

【问题讨论】:

  • 您是否尝试过使用简单的布尔标志?输入SetData时将其设置为true,退出时设置为false,然后在订阅回调中,如果设置了标志,则立即返回
  • 我认为这应该是一个答案。我就是这样做的,尽管您也可以删除订阅处理程序,如果您在添加它时存储了对它的引用,如下所述:stackoverflow.com/questions/10653030/…
  • @antishok 非常感谢。我非常喜欢为ko 寻找解决方案,以至于我完全忘记了更简单的解决方案:) 请将您的评论更改为答案

标签: javascript knockout.js


【解决方案1】:

一个简单的布尔标志就足够了。输入SetData时设置为true,退出时设置为false,然后在订阅回调中,如果设置了标志,则立即返回:

    var updatingData = false;

    self.SetData = function (itemdata) {
        updatingData = true;
        self.ProductId (itemdata ? itemdata.ProductId : null);
        self.Code1(itemdata ? itemdata.Code1 : null);
        self.Code2(itemdata ? itemdata.Code2 : null);
        self.Title(itemdata ? itemdata.Title : null);
        updatingData = false;
    };

    self.SetData(data);

    self.Code1.subscribe(function (value) 
    {
        if (updatingData) return;
        var productInfo = Ajax_GetPartDataWithCode1(value);
        self.SetData(productInfo);
    });

    self.Code2.subscribe(function (value) {
        if (updatingData) return;
        var productInfo = Ajax_GetPartDataWithCode2(value);
        self.SetData(productInfo);
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2016-01-27
    • 2012-08-13
    • 2015-01-29
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多