2015-11-24 60 views
1

我有一個下拉窗體和頁面使用Knockout JS將數據綁定到html元素我有下面的代碼預填充數據庫中的值。

JS

self.Irr = ko.observableArray([]); 

    self.Crp = ko.observableArray([]); 

    self.Incr = ko.observableArray([]); 

    self.Brnd = ko.observableArray([]); 

    self.Sec4 = ko.observableArray([]); 

    $.getJSON("GetIrr", null, function (data) { self.Irr(data); }) 
     .done(function() { 
      $.getJSON("GetCrp", null, function (data) { self.Crp(data); }); 
     }) 
     .done(function() { 
      $.getJSON("GetTill", null, function (data) { self.Sec4(data); }); 
     }) 
     .done(function() { 
      $.getJSON("GetBrnd", null, function (data) { self.Brnd(data); }); 
     }) 
     .done(function() { 
      $.getJSON("GetIncr", null, function (data) { self.Incr(data); }); 
     }) 
     .done((function() { 
      var request = $.ajax({ 
       type: "POST", 
       dataType: 'json', 
       url: "UserSavedData", 
       data: { "InfoVal": $("#infoID").val() } 
      }); 


      request.success(function (result) { 

    // here i use the result data to get ids of the dropdown values and 
    //fill the form 

} 

從可觀察陣列中的數據不會被填充(不能作爲的getJSON respnonse需要更多的時間來加載我想分配結果ID對象)由於$的getJSON的網絡定時調用我該如何處理這

按我所用的那麼建議()代替()完成,但仍然有不能夠加載數據的問題(即不填充一個場做節目當我放置一個斷點和德在Chrome中的錯誤,但沒有調試時,它不顯示值)

回答

3

如果你希望你的承諾連續鏈接,你需要使用.then()方法,並確保你從成功處理程序返回任何新的承諾,以使他們可鏈接。

$.getJSON('first') 
    .then(function(){ 
    return $getJSON('second'); 
    }) 
    .then(function(){ 
    return $.getJSON('third'); 
    }); 

你現在就溜跑一次全部作爲第一個呼叫「完成」,因爲你並沒有真正鏈接的承諾,你只是加入一些成功處理程序的第一個應許的代碼。

下面是一個示例,它顯示了兩種方法之間的區別。

(function(){ 
 

 
    function sayHelloAsync(msg){ 
 
    var def = jQuery.Deferred(); 
 
    
 
    setTimeout(function(){ 
 
     $("<div>" + msg + "</div>").appendTo("#messages"); 
 
     def.resolve(); 
 
    }, getRandomInt(300, 1500)); 
 
    
 
    return def.promise(); 
 
    } 
 
    
 
    function clearMessages(){ 
 
    $("#messages").html(''); 
 
    } 
 
    
 
    function getRandomInt(min, max) { 
 
    return Math.floor(Math.random() * (max - min)) + min; 
 
} 
 
    
 
    function allAtOnce(){ 
 
    clearMessages(); 
 
    
 
    sayHelloAsync("first") 
 
    .done(function(){ 
 
     sayHelloAsync("second"); 
 
    }) 
 
    .done(function(){ 
 
     sayHelloAsync("third"); 
 
    }) 
 
    .done(function(){ 
 
     sayHelloAsync("fourth"); 
 
    }); 
 
    } 
 
    
 
    function ordered(){ 
 
    clearMessages(); 
 
    
 
    sayHelloAsync("first") 
 
    .then(function(){ 
 
     return sayHelloAsync("second"); 
 
    }) 
 
    .then(function(){ 
 
     return sayHelloAsync("third"); 
 
    }) 
 
    .then(function(){ 
 
     return sayHelloAsync("fourth"); 
 
    }); 
 
    } 
 

 
    $("#allAtOnce").on('click', allAtOnce); 
 
    $("#ordered").on('click', ordered); 
 
    
 
}());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="allAtOnce" type="button">All At Once</button> 
 
<button id="ordered" type="button">Ordered</button> 
 
<h2>Messages</h2> 
 
<div id="messages"> 
 
</div>

+1

偉大的答案。也許在'sayHelloAsync'內的'setTimeout'調用中使用隨機超時長度將更好地表明許多對$ .getJSON的調用將以隨機順序返回。 – csum

+0

@csum - 好的建議。進行更改以使用隨機超時。 – Josh

+0

這工作了幾次,但當我嘗試刷新頁面或重定向回頁面它仍然不會填充(只有一個字段),但是當我嘗試在Chrome中調試並放置一個斷點時,我可以看到ID正在放置在選定的可觀察對象中。猜測當我有它的中斷點時,它有更多的時間來加載數據 – sss111

1

+1喬什。

更具敲擊性的方法是讓每個可觀察到的subscribe都取決於它的可觀察性(注意,您可以將observableArray作爲成功函數傳遞,不需要包裝它)。

self.Irr = ko.observableArray([]); 
self.Crp = ko.observableArray([]); 
self.Incr = ko.observableArray([]); 
self.Brnd = ko.observableArray([]); 
self.Sec4 = ko.observableArray([]); 

$.getJSON("GetIrr", null, self.Irr); 
self.Irr.subscribe(function() { 
    $.getJSON("GetCrp", null, self.Crp); 
}); 
self.Crp.subscribe(function() { 
    $.getJSON("GetTill", null, self.Sec4); 
});