【问题标题】:Alternative method to knockout virtual binding淘汰虚拟绑定的替代方法
【发布时间】:2015-01-28 04:47:59
【问题描述】:

我有以下代码在 Chrome、Firefox 和 IE10 中完美运行,但在 IE9 中无法运行。具体来说,IE9 似乎不允许在 select 元素中进行虚拟绑定。我一直在尝试寻找一种替代方法来做我目前正在做的事情(一个列表包含属性“IsSelected”等于 false 的所有元素,另一个列表包含属性“IsSelected”等于 true 的所有元素)但可以似乎没有找到在所有浏览器之间兼容的正确方法。

<select data-bind="foreach:Credentials" multiple="multiple" id="UnselectedCredentialsList" name="UnselectedCredentialsList" size="22">
    <!-- ko 'if': !IsSelected() -->
    <option data-bind="text:Name,value:Id" class="qloptions"></option>
    <!-- /ko -->
</select>

<select data-bind="foreach:Credentials" multiple="multiple" id="SelectedCredentialsList" name="SelectedCredentialsList">
    <!-- ko 'if': IsSelected() -->
    <option data-bind="text:Name,value:Id" class=" qloptions"></option>
    <!-- /ko -->
</select>

【问题讨论】:

  • 这个问题与您之前的问题有何不同? stackoverflow.com/questions/28174438/…
  • 你不能在你的视图模型中添加两​​个计算出来的 observable,一个是你的 Credentials,由 IsSelected() == true 过滤,另一个是 false

标签: knockout.js


【解决方案1】:

正如您现在删除的上一个问题中的链接问题所说:

Knockout virtual elements not working with Internet Explorer

这是&lt;IE 10 的选择标签中的虚拟元素的一个已知问题

解决此问题的一种方法是拥有computed 属性,您可以将每个select 绑定到这些属性。例如,在您的虚拟机内部:

var self = this;
self.selectedCredentials = ko.computed(function() {
    return ko.utils.arrayFilter(self.Credentials(), function(item) {
        return item.IsSelected();
    });
}

然后你可以绑定它:

<select data-bind="options:selectedCredentials, optionsText: 'Name', optionsValue: 'Id'"
    multiple="multiple" id="UnselectedCredentialsList" 
    name="UnselectedCredentialsList" size="22">

显然你可以对未选择的项目做同样的事情。

【讨论】:

  • 当你说我会对未选择的项目做同样的事情时,你的意思是我也会创建一个新的计算数组吗?或者我只是创建另一个与未选择项目相对应的选择组?
  • @John:是的,创建另一个计算但使用过滤器!item.IsSelected()。如果你想变得花哨,你可能会想出如何通过一个单一的计算循环只在集合中执行一次,但除非集合很大,否则可能不值得付出努力。
猜你喜欢
  • 2013-07-18
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2013-02-04
  • 2013-01-01
  • 1970-01-01
相关资源
最近更新 更多