2015-06-09 37 views
0

我有一個淘汰賽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 

回答

0

One problem是,您使用的是pureComputed與副作用的功能。

您的成功部分還有一個額外的c在acccountError

擴展器非常可怕。如果您通過計算器而不是其類型,並且不需要添加inProgress成員,則它變得微不足道。

ko.extenders.async = function (nonObservableComputed, observableResult) { 
    nonObservableComputed.subscribe(function (result) { 
     jQuery.when(result).then(observableResult); 
    }); 
    return observableResult; 
} 

演示:http://jsfiddle.net/sp160tan/1/

更新 很肯定你的問題是,您傳回阿賈克斯的結果,而不是推遲。此外,成功和錯誤回調不需要返回任何東西;它們的返回值不被使用。這可能是混淆的來源。

} 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; 
    } 
+0

試過這個。上面更新的代碼。仍然有同樣的問題。儘管var isValid = false,這就是延期解決和返回。 self.isAccountValid的值仍然是返回數據的對象,而不是正在返回的布爾值。它被設置爲從ajax調用返回而不是我正在解析延遲爲的值。 –

+0

你的成功部分應該返回延期的,而不是ajax。 ajax成功和錯誤部分是不需要返回任何東西的回調。 –

+0

謝謝。這是我的問題。我被掛掉了,不得不從我原來的擴展器中返回ajax。這工作完美。再次感謝。 –