Javascript 为模型制作淘汰订户,然后再次打开
我是个新手,不知道我做得对不对 我有一个购物车编辑器,就像击倒现场示例一样,只是我想有一个更高级的产品选择器。我的产品实际上有两种代码,用户必须能够输入其中一种代码,并在购物车上获取产品的完整详细信息。因此,每种代码都有两个输入,当用户在其中任何一种代码中输入代码时,我应该进行ajax调用并加载产品信息(包括productId、productName、其他代码等) 我试图通过订阅code1和code2来实现这一点-在从服务器获取数据后进行ajax调用并设置模型的数据,但它会触发一种递归事件(subscribe),从而重复调用ajax方法。因此我相信如果可以在Javascript 为模型制作淘汰订户,然后再次打开,javascript,knockout.js,Javascript,Knockout.js,我是个新手,不知道我做得对不对 我有一个购物车编辑器,就像击倒现场示例一样,只是我想有一个更高级的产品选择器。我的产品实际上有两种代码,用户必须能够输入其中一种代码,并在购物车上获取产品的完整详细信息。因此,每种代码都有两个输入,当用户在其中任何一种代码中输入代码时,我应该进行ajax调用并加载产品信息(包括productId、productName、其他代码等) 我试图通过订阅code1和code2来实现这一点-在从服务器获取数据后进行ajax调用并设置模型的数据,但它会触发一种递归事件(su
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
寻找解决方案,以至于我完全忘记了更简单的解决方案:)请将您的评论变成一个答案