我有一個淘汰賽pureComputed可觀察到,如果一個帳號是有效的應該返回。 首先它檢查該字段是否爲空。 (返回false) 然後它會檢查帳號是否已從加載的內容更改過。 (返回true) 最後它會運行ajax調用來獲取帳戶信息。 如果成功,它將從對象和客戶信息中設置ErrorMessage。然後它應該基於ErrorMessage返回true或false。 如果不成功,它將設置ErrorMessage並返回false。Knockout計算可觀察布爾值,使用ajax調用不返回布爾值在成功
self.isAccountValid = ko.computed(function() {
if (!self.account()) {//If not complete mark as InValid
self.accountError("Account Number Incomplete.")
return false;
} else if (vm.account == self.account()) {
self.accountError("");
return true;
} else {
var deferred = $.Deferred();
return $.ajax({
url: '/Order/NumberValidation',
data: { account: self.account() }
}).success(function (data) {
self.accountError(data.ErrorMessage);
//Set customer info properties
self.setCustomerInfo(data);
//Set success or warn icon based on error message field
var isValid = !data.ErrorMessage;
deferred.resolve(isValid);
return deferred;
}).error(function (data) {
//Set error message for invalid account
self.accountError("Server error. Please try again in a few minutes.");
//Set warning icon
return false;
})
}
}).extend({ async: ko.observable() });
他們延長是我發現允許方法計算,以等待Ajax調用:
ko.extenders.async = function (nonObservableComputed, observableResult) {
nonObservableComputed.subscribe(function (result) {
jQuery.when(result).then(observableResult);
});
return observableResult;
}
這是正確設置成功的其他數據,但返回data.ErrorMessage如果通過調試查看它的值不是爲isAccountValid的值設置的,那麼它的計算結果爲false。相反,它被設置爲整個數據對象,即使我試圖返回布爾值。
myViewModel.isAccountValid()
Object {FirstName: null, LastName: null, StreetAddress: null, City: null, State: null…}
City: null
ErrorMessage: "Sequence contains no matching element"
FirstName: null
LastName: null
PhoneNumber: 0
State: null
StreetAddress: null
ZipCode: 0
試過這個。上面更新的代碼。仍然有同樣的問題。儘管var isValid = false,這就是延期解決和返回。 self.isAccountValid的值仍然是返回數據的對象,而不是正在返回的布爾值。它被設置爲從ajax調用返回而不是我正在解析延遲爲的值。 –
你的成功部分應該返回延期的,而不是ajax。 ajax成功和錯誤部分是不需要返回任何東西的回調。 –
謝謝。這是我的問題。我被掛掉了,不得不從我原來的擴展器中返回ajax。這工作完美。再次感謝。 –