【问题标题】:Instantiate a property from viewModel within foreach在 foreach 中从 viewModel 实例化一个属性
【发布时间】:2015-08-26 20:43:55
【问题描述】:

我正在使用淘汰赛的foreach 迭代一个对象。在这个 foreach 中,我渲染了一个表格,每个表格都有一个下拉列表。

我需要选择的值,但是 ko.observable() 在 foreach 中不起作用,因为它同时设置每个选择值。我需要每个字段的单独选择值,而不是将每个选择设置为相同的值。

有解决办法吗?

<!--ko foreach: {data: thing, as: 'blah'}-->
<div data-bind="text: JSON.stringify(blah)"></div>
<select data-bind="options: $root.countries, optionsText: 'name', optionsValue: 'id', value: $root.selectedChoice, optionsCaption: 'Choose..'"></select>
<br/>
<input type="button" data-bind="click: $root.sendMe, enable: $root.selectedChoice" Value="Click Me"/>
<!--/ko-->

This is a fiddle用一个简单的例子来演示。

【问题讨论】:

  • 您需要thing 对象的selectedChoice 成员。
  • 不,它仍在同时更改所有值,即使在被循环的对象内也是如此。

标签: javascript knockout.js foreach


【解决方案1】:

如果您有多个下拉菜单,如果您想保存单个选择,您将需要多个可观察对象来存储所选值。例如:

var CountryModel = function (data) {
    var self = this;

    self.id = ko.observable(data.id);
    self.name = ko.observable(data.name);
};

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

    self.things = ko.observableArray([
        { blarg: 'blarg', selectedChoice: ko.observable() }, 
        { means: 'means', selectedChoice: ko.observable() }, 
        { yes: 'yes', selectedChoice: ko.observable() }
    ]);

    self.countries = ko.observableArray([
    	new CountryModel({ id: "1", name: "Russia" }),
    	new CountryModel({ id: "2", name: "Qatar" })
    ]);
};

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

<!--ko foreach: {data: things, as: 'thing'}-->
<div data-bind="text: ko.toJSON(thing)"></div>
<select data-bind="options: $root.countries,
                   optionsText: 'name', 
                   optionsValue: 'id', 
                   value: selectedChoice,
                   optionsCaption: 'Choose..'">        
</select>
<hr>
<!--/ko-->

【讨论】:

  • 好吧,这还是不行。您将 observables 放在错误的数组中,它仍然同时选择所有选择。
  • 如何“[它]不起作用”? sn-p 运行并且有意义,不是吗?为什么该数组“错误”?哪个是正确的数组? “它仍然同时选择所有选择”是什么意思?
  • 它在这个例子中工作,而不是在我的代码上,这需要页面上传。抱歉,对于这个例子来说,这是一个很好的解决方案,但它在我的代码中不起作用,不完全确定为什么
  • 啊,是的,制作一个足够接近的复制品可能很困难,因此解决方案也可以翻译回来。它必需的,但在这里的其他人可以提供帮助之前,因为我们无权访问完整的代码。我建议提出一个新的 SO 问题,详细说明它与这个问题的不同之处以及我在这里的回答没有帮助。
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2016-01-08
  • 2013-05-06
相关资源
最近更新 更多