Knockout计算了observable boolean,它使用ajax调用而不是在sucess上返回boolean

时间:2015-06-09 20:03:24

标签: ajax knockout.js

我有一个淘汰的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

1 个答案:

答案 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;
    }