在页面加载时订阅价值

问题描述:

我有两个ajax调用。一个在第一个下拉列表中加载释放周期,另一个在第二个下拉列表中加载方案。第二个下拉菜单中的方案对应于第一个下拉列表中选择的值。我无法加载页面加载。我必须通过单击第一个下拉列表中的选项来选择值,然后才能加载第二个下拉列表中的选项。如何在页面加载中实现此功能,而不是通过手动选择或触发该事件。我不希望使用ko处理程序。感谢您提前帮助。在页面加载时订阅价值

//load release cycles in first dropdown 
self.pushReleaseCycles = function(releaseCycleUrl,scenarioNameUrl1,scenarioNameUrl2){ 
    $.ajax({ 
     url: sharepointScenarioListUrl + releaseCycleUrl, 
     method: "GET", 
     headers: { "Accept": "application/json; odata=verbose" }, 
     success: function (data) { 
      var items = data.d.results; 
      items.forEach(function(item) { 
       if (self.release_cycles.indexOf(item.Release_x0020_Cycle) == -1) { 

        self.release_cycles.push(item.Release_x0020_Cycle); 
       } 
      }); 

      self.selectedCycle.subscribe(function(value) { 
       self.scenarios([]); 
         self.pushScenariosToDropdown(value,scenarioNameUrl1,scenarioNameUrl2); 
      }); 
     }, 
     error: function (data) { 
      alert("ERROR in function pushReleaseCycles : " + data);console.log(data); 
     } 
    }); 
}; 

//load scenarios in second dropdown 
self.pushScenariosToDropdown = function(value,scenarioNameUrl1,scenarioNameUrl2){ 
    $.ajax({ 
     url: sharepointScenarioListUrl + scenarioNameUrl1 + value + scenarioNameUrl2, 
     method: "GET", 
     headers: { "Accept": "application/json; odata=verbose" }, 
     success: function (data) { 
      var items = data.d.results; 
      items.forEach(function(item) { 
       self.scenarios.push(new ScenarioModel(item)); 
       console.log(data); 
      }); 
      self.selectedScenario.subscribe(function(value) { 
       dbName = ko.toJSON(value.title); 
       jarFile1 = ko.toJSON(value.jar); 
       fdMimoAvailable = ko.toJSON(value.fdmimo); 
       self.setValues(dbName,jarFile1,fdMimoAvailable); 
      }); 
     }, 
     error: function (data) { 
      alert("ERROR in function pushScenariosToDropdown: " + data);console.log(data); 
     } 
    }); 
}; 

我的HTML:

<select id="dropdown" required class="form-control select2" data-bind="options: release_cycles,value:selectedCycle"> 
</select> 

<select id="dropdown2" required="required" class="form-control select2" data-bind="options: scenarios, optionsText:'scenarioName',optionsCaption:'Please Select Scenario', value:selectedScenario,validationOptions: { errorElementClass:'input-validation-error' },selectedOptions: chosenScenario"> 
</select> 

如果你不想去从服务器获取的值基于第一值的第二个选择框,但要加载整个数据集,然后加载第二个盒子的所有选项的json对象,然后在第一个选择之后解析它。如果它有很多数据,它会影响性能。

+0

这并不提供答案的问题。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/16884391) – rafalmp

+0

它确实提供了一个答案。 OP想知道如何做。我提供了一个答案。 OP似乎并没有特别要求代码,而是更类似于最好的方法。 – Difster

我会处理这个问题的方式是改变数据如何从服务器中提取。您需要包含页面所需的整个菜单结构。在我看来,最好稍长的负载,而不是一个波涛汹涌的经验。这里有一个嵌套菜单的例子,以及它的外观。

function ViewModel() { 
 
    var self = this; 
 

 
    self.Dropdown1 = ko.observableArray(); 
 
    self.SelectedItem1 = ko.observable(); 
 

 
    self.Dropdown2 = ko.computed(function() { 
 
    if (self.SelectedItem1() == null) { 
 
     return []; 
 
    }; 
 
    console.log(ko.toJS(self.SelectedItem1())) 
 
    return self.SelectedItem1().Submenu; 
 
    }); 
 

 
    self.SelectedItem2 = ko.observable(); 
 

 
    self.LoadDropDown = function() { 
 
    self.Dropdown1.push({ 
 
     "Name": "Hat", 
 
     "Value": "top", 
 
     "Submenu": [{ 
 
      "Name": "Blue", 
 
      "Value": "#0000FF" 
 
     }, 
 
     { 
 
      "Name": "Green", 
 
      "Value": "#00FF00" 
 
     }, 
 
     { 
 
      "Name": "Red", 
 
      "Value": "#FF0000" 
 
     } 
 
     ] 
 
    }); 
 
    self.Dropdown1.push({ 
 
     "Name": "Shirt", 
 
     "Value": "middle", 
 
     "Submenu": [{ 
 
      "Name": "Striped", 
 
      "Value": "Striped" 
 
     }, 
 
     { 
 
      "Name": "Logo", 
 
      "Value": "Logo" 
 
     }, 
 
     { 
 
      "Name": "Plain", 
 
      "Value": "None" 
 
     } 
 
     ] 
 
    }); 
 
    self.Dropdown1.push({ 
 
     "Name": "Pants", 
 
     "Value": "bottom", 
 
     "Submenu": [{ 
 
      "Name": "Jeans", 
 
      "Value": "Jeans" 
 
     }, 
 
     { 
 
      "Name": "Kakhis", 
 
      "Value": "Kakhis" 
 
     }, 
 
     { 
 
      "Name": "Cordroy", 
 
      "Value": "Cordroy" 
 
     } 
 
     ] 
 
    }); 
 
    } 
 
    self.LoadDropDown(); 
 

 

 
} 
 

 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 

 
<select data-bind="options: Dropdown1, optionsText: 'Name', value: SelectedItem1"></select> 
 

 
<select data-bind="options: Dropdown2, optionsText: 'Name', value: SelectedItem2"></select>