我有一个淘汰的pureComputed observable,如果账号有效,应该返回。 首先,它检查该字段是否为空。 (返回false) 然后检查帐号是否已从加载的帐号更改。 (返回true) 最后,它将运行ajax调用以获取帐户信息。 如果成功,它将从对象和客户信息中设置ErrorMessage。然后它应该基于ErrorMessage返回true或false。 如果不成功,它将设置ErrorMessage并返回false。
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;
}
这是在成功时正确设置其他数据,但是如果通过调试查看它,则返回值为false的!data.ErrorMessage不是为isAccountValid的值设置的。相反,它被设置为整个数据对象,即使我试图只返回布尔值。
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
答案 0 :(得分:0)
One problem是您使用pureComputed
来处理带副作用的函数。
您的成功部分中acccountError
还有一个额外的c。
扩展器非常可怕。如果你传递它想要使用的计算而不是它的类型,并且不需要添加inProgress
成员,它就变得微不足道了。
ko.extenders.async = function (nonObservableComputed, observableResult) {
nonObservableComputed.subscribe(function (result) {
jQuery.when(result).then(observableResult);
});
return observableResult;
}
演示:http://jsfiddle.net/sp160tan/1/
<强>更新强> 很确定你的问题是你要返回ajax结果而不是延迟结果。此外,成功和错误回调不需要返回任何内容;他们的返回值没有使用。这可能是混乱的原因。
} else {
var deferred = $.Deferred();
$.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);
}).error(function (data) {
//Set error message for invalid account
self.accountError("Server error. Please try again in a few minutes.");
//Set warning icon
deferred.resolve(false);
})
return deferred;
}