4

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

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

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

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

任何帮助将不胜感激!

4

1 回答 1

2

一个简单的布尔标志就足够了。进入时将其设置为 true,SetData退出时将其设置为 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);
    });
于 2012-08-01T02:25:35.983 回答