2016-02-02 101 views
0

我想添加一個新的字段到asp.net MVC 5網站彈出窗口,首先使用Entity Framework 6代碼,Typescript和Knockout JS進行數據綁定。我沒有寫這個網站。我已經做了幾個月的改變。原來的程序員不在公司。我以前從未使用過這些技術。Knockout JS綁定計算observable不起作用

新字段是Web服務調用的結果。 Web方法確實返回結果。但是,該值不顯示在屏幕上。我腳本運行並顯示所有其他數據。顯示頁面後,延遲調用Web服務。我將提供標記和視圖模型代碼。任何意見是極大的讚賞。

下面就是HTML勢必計算性能:

this.PredictedValue = ko.pureComputed(() => { 
       var age = ""; 
       var race = ""; 
       var height = ""; 
       var studyId = this.Session().Study.PftCentralStudyId(); 
       var predictedSetName; 
       var predictedSetId; 
       var gender; 
       if (this.StudyTestParameter().HasPredictedValues() == true) { 
        ko.utils.arrayForEach(this.Session().Study.StudyTestTypePredictedSets(),(item: Bll.TestTypePredictedSetVm) => { 
         if (String(item.TestType().Name()) == this.StudyTestParameter().TestType().Name()) 
          predictedSetId = item.PredictedSetId(); 
        }); 
        if (predictedSetId == 0) { 
         return ""; 
        } 
        else { 
         var match = ko.utils.arrayFirst(this.Session().PftCentralStudyPredictedSets(),(item: Bll.PftCentralPredictedSetsVm) => { 
          return String(item.Id) == String(predictedSetId) 
         }); 
         predictedSetName = match.Name; 
         ko.utils.arrayForEach(this.Session().SessionValues(),(item: SessionValueVm) => { 
          if (String(item.StudySessionParameter().Name()) == "Age") 
           age = String(item.RecordedValue()); 
         }); 
         ko.utils.arrayForEach(this.Session().SessionValues(),(item: SessionValueVm) => { 
          if (String(item.StudySessionParameter().Name()) == "Race") 
           race = String(item.RecordedValue()); 
         }); 
         ko.utils.arrayForEach(this.Session().SessionValues(),(item: SessionValueVm) => { 
          if (String(item.StudySessionParameter().Name()) == "Height") 
           height = String(item.RecordedValue()); 
         }); 
         ko.utils.arrayForEach(this.Session().SessionValues(),(item: SessionValueVm) => { 
          if (String(item.StudySessionParameter().Name()) == "Sex") 
           gender = String(item.RecordedValue()); 
         }); 
         var promise = this.Session().CalculatePredicted(age, race, gender, height, String(this.StudyTestParameter().PftCentralStudyParameterId()), predictedSetName, studyId); 
         promise.done((data: string) => { 
          return data 
         }); 
        } 
       } 
       else 
        return ""; 
      }); 

CalculatePredicted = (age: string, race: string, gender: string, height: string, studySessionParameterId: string, predictedSetName: string, studyId: number) => { 

      var deferred = $.Deferred(); 

      $.ajax({ 
       url: "/Workflows/CalculatePredicted", 
       cache: false, 
       data: { age: age, ethnicity: race, gender: gender, height: height, studySessionParameterId: studySessionParameterId, testTypePredictedSetName: predictedSetName, studyId: studyId }, 
       dataType: "json", 
       contentType: "application/json charset=utf-8" 
      }).done(data => { 
       deferred.resolve(data); 
      }).fail((jqXHR) => { 
       alert(jqXHR.responseText); 
       deferred.reject(); 
      }); 
      return deferred; 
     } 

下面是HTML。

<div> 
             Test Values: 
             <table class="width100pct gridtable"> 
              <tbody data-bind="foreach: TestValues"> 
              <tr> 
               <td data-bind="text: StudyTestParameter().Name"></td> 
               <td data-bind="text: RecordedValue"></td> 
               <td data-bind="text: ATSBestValue"></td> 
               <td data-bind="text: PredictedValue"></td> 
              </tr> 
              </tbody> 
             </table> 
            </div> 

回答

1

您的承諾對象無法返回您的計算機。在承諾完成時,計算器很久以前就返回'未定義'。這是異步調用的本質。考慮在promise.done()函數內設置一個不同的observable,並將其綁定到UI中的新字段。如果基礎字段改變,計算的函數仍然會觸發。

+0

如果這是問題,一旦承諾返回並且計算值發生變化,視圖是否最終會更新?我已經使用包含異步調用的計算變量多次沒有問題。 – HotTowelie

+1

您不能有一個承諾返回計算值,這是基本的異步的東西。你必須更新UI中的另一個承諾。 – dfperry

+0

我誤解了。你是對的。 – HotTowelie