Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当设置了可观察对象时,防止knockout调用subscribe_Javascript_Jquery_Ajax_Knockout.js - Fatal编程技术网

Javascript 当设置了可观察对象时,防止knockout调用subscribe

Javascript 当设置了可观察对象时,防止knockout调用subscribe,javascript,jquery,ajax,knockout.js,Javascript,Jquery,Ajax,Knockout.js,我有两个输入绑定到它们自己的可观察对象。两者都有一个subscribe函数来启动ajax调用。还有一些其他字段将从ajax结果中填写。我希望能够在键入companyName时获取数据。我还想在输入cardNumber时获得companyName(以及更多),但是给companyName一个值将触发其subscibe函数,该函数将启动另一个ajax调用。我想阻止这种事情发生 cardNumber = ko.observable(); companyName = ko.observable();

我有两个输入绑定到它们自己的可观察对象。两者都有一个subscribe函数来启动ajax调用。还有一些其他字段将从ajax结果中填写。我希望能够在键入companyName时获取数据。我还想在输入cardNumber时获得companyName(以及更多),但是给companyName一个值将触发其subscibe函数,该函数将启动另一个ajax调用。我想阻止这种事情发生

cardNumber = ko.observable();
companyName = ko.observable();

cardNumber.subscribe(function () {
        getDataFromCardNumber(cardNumber());
});
companyName.subscribe(function () {
        getDataFromCompanyName(companyName());
});

getDataFromCardNumber = function (cardNr) {
    $.ajax({
        type: 'GET',
        data: { number: cardNr },
        url: '/Home/GetCardInfo',
        success: function (data) {
           companyName(data.Company.CompanyName);
           //some other fields
        }
    });
};
//getDataFromCompanyName(name) contains another ajax call to fill out some other fields aswell
我看到两种选择:

  • 在从回调写入之前,您可以
    处理订阅
    ,然后在设置新值时重新附加订阅
const obsA=ko.可观测(“a”);
常数obsB=可观测(“b”);
const updateA=newVal=>setTimeout(
() => {
subA.dispose();
obsA(“由B重置”);
subA=obsA.subscribe(updateB);
}, 500);
const updateB=newVal=>setTimeout(
() => {
subB.dispose();
obsB(“由A重置”);
subB=obsB.subscribe(updateA);
}, 500);
设subA=obsA.subscribe(updateB);
设subB=obsB.subscribe(updateA);
ko.应用绑定({obsA,obsB})

A:

B:
在调用ajax请求之前,您可以检查是否已经存在卡号或公司名称

cardNumber.subscribe(function () {
    if (!companyName()){
       getDataFromCardNumber(cardNumber());
    }
});

companyName.subscribe(function () {
    if (!cardNumber()){
        getDataFromCompanyName(companyName());
    }
});

我一直在寻找可写的计算函数。这帮我解决了我的问题:)