2015-04-23 74 views
0

我有一個帶有第一個請求的頁面,在此頁面中爲我的頁面恢復所有必需的數據。選擇相互之間依存關係和預選取值

此信息是這樣的一種:

「A1」:8, 「A2」:61, 「A3」:585, 「A4」:空.........等

如果每個值是一個在淘汰賽加載的特定選擇ID:您選擇

<div class="col-lg-3 col-md-3"> 
    <label class="obligatory">*</label> 
    <label for="id_A1">A1</label> 
    <select class="form-control" data-bind="options: $root.A1List, optionsText: 'A1name' , optionsValue: 'idA1', value: $data.A1, optionsCaption: '---------------'"></select> 
</div> 
<div class="col-lg-3 col-md-3"> 
    <label class="obligatory">*</label> 
    <label for="id_A2">A2</label> 
    <select class="form-control" data-bind="options: $root.A2List, optionsText: 'A2name' , optionsValue: 'idA2', value: $data.A2, optionsCaption: '---------------'"></select> 
</div> 
<div class="col-lg-3 col-md-3"> 
    <label class="obligatory">*</label> 
    <label for="id_A3">A3</label> 
    <select class="form-control" data-bind="options: $root.A3List, optionsText: 'A1name' , optionsValue: 'idA3', value: $data.A3, optionsCaption: '---------------'"></select> 
</div> 
<div class="col-lg-3 col-md-3"> 
    <label class="obligatory">*</label> 
    <label for="id_A4">A4</label> 
    <select class="form-control" data-bind="options: $root.A4List, optionsText: 'A4name' , optionsValue: 'idA4', value: $data.A4, optionsCaption: '---------------'"></select> 
</div> 

這些選擇都依賴於彼此在選擇的功能:

root.A2List = ko.observableArray([]); 
root.A2ListFuncion = ko.computed(function(){ 
    $.ajax({ 
     url: RUTA_GLOBAL + "/api/A2/", 
     dataType: 'json', 
     async: true, 
     type:'GET', 
     data: { 
      A1: root.Data().A1() 
     }, 
     success: function(data) { 
      root.A2List(ko.mapping.fromJS(data)()); 
     } 
    }); 

}, root); 
root.A3List = ko.observableArray([]); 
root.A3ListFuncion = ko.computed(function(){ 
    $.ajax({ 
     url: RUTA_GLOBAL + "/api/A3/", 
     dataType: 'json', 
     async: true, 
     type:'GET', 
     data: { 
      A1: root.Data().A1() 
      A2: root.Data().A2() 
     }, 
     success: function(data) { 
      root.A3List(ko.mapping.fromJS(data)()); 
     } 
    }); 

}, root); 
root.A4List = ko.observableArray([]); 
root.A4ListFuncion = ko.computed(function(){ 
    $.ajax({ 
     url: RUTA_GLOBAL + "/api/A4/", 
     dataType: 'json', 
     async: true, 
     type:'GET', 
     data: { 
      A1: root.Data().A1() 
      A2: root.Data().A2() 
      A3: root.Data().A3() 
     }, 
     success: function(data) { 
      root.A4List(ko.mapping.fromJS(data)()); 
     } 
    }); 

}, root); 

我得到了每個選擇的所有值正確,但我失去了正確的值或ID哪一個應該在用戶第一次發出請求時選擇。我明白,由於計算我的選擇列表,我想要的功能,但我需要第一次當每次選擇頁面加載第一次時的預選值。

有什麼想法?

+0

您的代碼示例不完整。你在哪裏給A1,A2,A3,A4賦值?這應該在創建計算的觀察值A * ListFunction後完成。另外,你使用敲除計算的觀測值非常奇怪。更好地用knockout訂閱功能替代它以提高可讀性。 – Artem

+0

對不起,但我不理解你,代碼是完整的 – charles

+0

你的問題是因爲綁定「value:$ data.A1」在列表A1List,A2List,A3List,A4List被填充值之前執行。在這種情況下,淘汰賽將找不到相應的選項並重置值。 – Artem

回答

0

阿爾喬姆感謝您的線索:

root.A3ListFuncion = ko.computed(function(){ 
    $.ajax({ 
     url: RUTA_GLOBAL + "/api/A3/", 
     dataType: 'json', 
     ***async: false,*** 
     type:'GET', 
     data: { 
      A1: root.Data().A1() 
      A2: root.Data().A2() 
     }, 
     success: function(data) { 
      root.A3List(ko.mapping.fromJS(data)()); 
     } 
    }); 

改變Ajax請求的異步假problme得到解決。