0

我有2个dropdownlists并与结合使用来计算观察到的功能是这样的结果的一个列表:如何在knockout JS变量中分配未定义的值?

 self.Records = ko.computed(function() { 
        if (self.dropdown1 !== undefined) { 
... 
         return Collection[0]; 
        } 

        if (self.dropdown2() != undefined) { 
        ... 
         return Collection[0]; 
        } 
       }); 

但我的问题是,我需要设置未定义的self.dropdown1值当我改变了valdown of dropdownlist2,对于我的收藏记录可以改变。

我用jQuery改变第一个下​​拉的值是这样的:

$('#reportTypeSelection').prop('selectedIndex', 0); 

但结合不清爽。任何建议请。

+0

self.dropdown1应self.dropdown1()..你也应该与剔除观测..不使用jQuery – Namrehs

回答

2

我想你不应该使用jQuery的代码逻辑。下面是一个如何在视图模型中完成这个视图的例子,其中视图不知道关于逻辑的任何信息。

var VM = function() { 
 
    
 
    var self = this; 
 

 
    self.items = ko.observableArray(["Item1", "Item2", "Item3"]); 
 

 
    self.dropdown1 = ko.observable(); 
 
    self.dropdown2 = ko.observable(); 
 

 
    self.dropdown1.subscribe(function(newValue) { 
 
    if (newValue) { 
 
     self.dropdown2(null); 
 
    } 
 
    }); 
 

 
    self.dropdown2.subscribe(function(newValue) { 
 
    if (newValue) { 
 
     self.dropdown1(null); 
 
    } 
 
    }); 
 
} 
 

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

 
<select data-bind="options:items, optionsCaption:'Select first item',value: dropdown1"></select> 
 

 
<select data-bind="options:items, optionsCaption:'Select second item',value: dropdown2"></select>

+1

设置您的下拉值我觉得你确实应该给予一定的信用到@ luiz-augusto-volpi-nascimento在这里,你的答案实际上只是他的一个稍微改进的版本。 – awj

+0

当然可以! @ luiz-augusto-volpi-nascimento版本正常工作,但我不同意我的版本是perf改进。区别在于我不使用DOM事件来驱动逻辑。该视图不知道选择更改时执行的任何代码。这是MVVM背后的主要思想。 –

1

你可以放更多的代码来帮助我们理解你在做什么。我假设你想在更改dropdown2时更改dropdown1的值。如果我是对的,你可以使用改变事件来做到这一点。

var ViewModel = function() { 
 
    var self = this; 
 

 
    self.data = ko.observableArray(["Dog", "Cat", "Bird"]); 
 

 
    self.dropdown1 = ko.observable(undefined); 
 
    self.dropdown2 = ko.observable(undefined); 
 

 
    self.changeDropDownValue = function(index) { 
 
    if (index == 1) 
 
     self.dropdown2(undefined); 
 
    else 
 
     self.dropdown1(undefined); 
 
    } 
 
} 
 

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

 
<select data-bind="options:data, optionsCaption:'Select a pet...',value: $root.dropdown1, event:{change:$root.changeDropDownValue(1)}" ></select> 
 
<select data-bind="options:data, optionsCaption:'Select a pet...',value: $root.dropdown2, event:{change:$root.changeDropDownValue(2)}" ></select>