淘汰赛动态<select>选项覆盖选择值

0 javascript ajax knockout.js knockout-3.0

我遇到的问题与AJAX的动态选择选项有关。

用例是,更改选择#1中的值应通过ajax填充选择#2中的选项。罕见的是,select#2的值也异步出现,但是使用了不同的ajax。

所述jsFiffle显示以下代码(简化-只有1 ajaxlike超时)。我们有2个选择,一个带有静态选项,另一个带有动态选项。两者都有价值约束。

<select id="select_1" data-bind="value: select_1_value">
<option selected>1</option>
<option>2</option>
<option>3</option>
</select>
<select id="select_2" data-bind="options:selectOptions, value: select_2_value"></select>
Select 2 value is <span data-bind="text: select_2_value">
Run Code Online (Sandbox Code Playgroud)

js部分看起来像这样:

var vm = function AppViewModel() {
this.selectOptions = ko.observableArray(['a','b','c']);
this.select_1_value = ko.observable(1);
this.select_2_value = ko.observable('a');

this.computedValue = ko.computed( function () {
    <!-- prevent from initial -->
    if (this.select_1_value() != 1)
    {
    console.log('changed');
    this.select_1_value();

    this.selectOptions.removeAll()
    var self = this
    setTimeout(function(){
       self.selectOptions.push(['e']);
       self.selectOptions.push(['f']);
       <!-- DOES WORK But i do not want it here -->
       <!--self.select_2_value('f');  -->
    }, 1000);        
    <!-- DOES NOT WORK -->
    this.select_2_value('f');
    }
}, this);   
}

$(function() {
   ko.applyBindings(new vm());
});
Run Code Online (Sandbox Code Playgroud)

您可以在jsfiddle中看到的是,当select_2_value设置为不在asynch部分时,在清除observableArray选项时它将被覆盖。

我认为周围存在设计缺陷。您能帮我指出一下吗。谢谢!

tci*_*and 5

您可以使用敲除的valueAllowUnset绑定,如果选择选项中不存在该值,则该绑定不会清除该值。

更新了JSFiddle

<select id="select_1" data-bind="value: select_1_value">
    <option selected>1</option>
    <option>2</option>
    <option>3</option>
</select>
<select id="select_2" data-bind="options:selectOptions, value: select_2_value, valueAllowUnset:true"></select>

Select 2 value is <span data-bind="text: select_2_value">
Run Code Online (Sandbox Code Playgroud)