Javascript 为模型制作淘汰订户,然后再次打开

Javascript 为模型制作淘汰订户,然后再次打开,javascript,knockout.js,Javascript,Knockout.js,我是个新手,不知道我做得对不对 我有一个购物车编辑器,就像击倒现场示例一样,只是我想有一个更高级的产品选择器。我的产品实际上有两种代码,用户必须能够输入其中一种代码,并在购物车上获取产品的完整详细信息。因此,每种代码都有两个输入,当用户在其中任何一种代码中输入代码时,我应该进行ajax调用并加载产品信息(包括productId、productName、其他代码等) 我试图通过订阅code1和code2来实现这一点-在从服务器获取数据后进行ajax调用并设置模型的数据,但它会触发一种递归事件(su

我是个新手,不知道我做得对不对

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

我试图通过订阅code1和code2来实现这一点-在从服务器获取数据后进行ajax调用并设置模型的数据,但它会触发一种递归事件(subscribe),从而重复调用ajax方法。因此我相信如果可以在
SetData
方法期间设置knockout subscription 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,然后在订阅回调中,如果设置了该标志,则立即返回:

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

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