Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 敲除选定选项绑定到";精选;财产_Javascript_Knockout.js - Fatal编程技术网

Javascript 敲除选定选项绑定到";精选;财产

Javascript 敲除选定选项绑定到";精选;财产,javascript,knockout.js,Javascript,Knockout.js,给定对象 var viewModel = { Opts: ko.observableArray([ { d: 'a', v: 0, selected: 1}, { d: 'b', v: 1, selected: 1}, { d: 'c', v: 2, selected: 1}, { d: 'd', v: 3, selected: 2}, { d: 'e', v: 4, selected: 1}, { d: 'f', v: 5, select

给定对象

var viewModel = {
    Opts: ko.observableArray([
    { d: 'a', v: 0, selected: 1},
    { d: 'b', v: 1, selected: 1},
    { d: 'c', v: 2, selected: 1},
    { d: 'd', v: 3, selected: 2},
    { d: 'e', v: 4, selected: 1},
    { d: 'f', v: 5, selected: 1}
    ]), 
    selectedOpts: ko.observableArray([])
};
我想绑定一个多选列表来更改“selected”属性的值,1为false,2为true。(它在服务器上的表示方式-实际上是状态代码)


​ 我知道如果我可以将selectedOptions绑定到selected属性,我就不需要selectedOpts对象,我只是不知道如何简单地执行此操作,而不设置selectedOpts的手动订阅以查看值列表并手动设置已选项的selected属性

我相信有一个简单的方法


谢谢

真的没有办法自动做你想做的事

您将拥有的一些选项:

  • 如您所示,设置对ObservalArray的手动订阅,并循环浏览选项以根据其是否在数组中设置值
  • 创建选项,使选定的
    是一个计算的可观察对象,根据其是否在数组中而不断更新。缺点是每个选项都有一个计算结果,每当ObservalArray更新时就会触发(效率低于单个手动订阅)
  • 编写一个自定义绑定,用于查找所选选项,并在绑定中执行订阅。也许您可以提供一个函数来执行每个选项,如:

    • 手动订阅并不可怕,而且非常有用。我已经修改了您的小提琴,以演示如果您只是让选定的属性可见,那么这将多么容易实现:


      从设计角度来看,订阅功能应该存在于您的viewModel对象中,您可能希望使用映射插件来避免手动创建可观察对象,但您明白了。

      是的,这是我最初考虑的方法,并且将要采取的方法。我们在解决方案中的真实视图模型是一个“映射”视图模型,我只是简单地举个例子。谢谢daedalus28:)我根据我的特定用途编辑了小提琴-再次感谢。在我的解决方案中,我还在ko.applyBindings之前添加了一个手动循环,以查看选项中是否有状态为2/1的选项,并在编辑视图中相应地更新selectedOpts数组。这些小提琴似乎消失了。有重新上传的机会吗?由于fiddle已经消失,这个答案现在是无用的Sthanks RP。我喜欢你的自定义绑定示例,但我认为它可能过于工程化,因为手动订阅/循环似乎非常简单,如下面的daedalus28所示。是的,我会使用手动订阅。只是想让你知道你有几个选择。
      <select data-bind="options: Opts,
          optionsText: 'd',
          optionsValue: 'v',
          selectedOptions: selectedOpts,
          optionsCaption: 'Choose...'" multiple=""></select>