【问题标题】:Load select options on demand with preserving the select state from beforeload按需加载选择选项,同时保留加载前的选择状态
【发布时间】:2013-09-08 07:11:42
【问题描述】:

首先,这是一个 fiddle,它表明了我的观点。

我有一个带有选择字段的简单表单。起初我只预加载了一个选择的选项,我想在单击选择字段时加载其余选项。这很好用,除了在将这些选项加载到选项的 observableArray 时,即使我在加载之前保存了选择然后我尝试恢复它,也会采用“选择”默认选项标题。

脚本是这样的

(function() {

    function COption(id, name) {
        this.ID = id;
        this.Name = name;
    }

    var Options = {
        List: ko.observableArray([
            new COption(1, "opt1")
        ]),
        Loaded: false
    }

    var Choice = ko.observable(1);

    function LoadOptions() {
        var opts = [
            new COption(1, "opt1"),
            new COption(2, "opt2"),
            new COption(3, "opt3")
        ];
        // Save current select state
        var currentChoice = Choice();
        console.log("the choice from before load is " + currentChoice);

        // Prevent loading on each click
        if (!Options.Loaded) {
        // Act as if it was an ajax request
            window.setTimeout(function() {
                Options.List(opts);
                Options.Loaded = true;
                // Bring back the state from beforeload
                Choice(currentChoice);
            }, 100);
        }
    }

    function ChangeOption() {

        var index = 1;
        if (Options.List()[index]) {
            console.log("the choice id is now " + Choice());
            Choice(Options.List()[index].ID);

            console.log("and now it is " + Choice());
        }
    }

    var vm = {
        Choice: Choice,
        Options: Options,
        LoadOptions: LoadOptions,
        ChangeOption: ChangeOption
    }

    ko.applyBindings(vm, document.getElementById("page"));

})(); 

我的观点是

<div id = "page">
    <div>
        <select data-bind = "options: Options.List, optionsCaption: 'Choose', optionsText: 'Name', optionsValue: 'ID', value: Choice, click: LoadOptions"></select>
    </div>
    <div>your choice's id: <span data-bind = "text: Choice"></span></div>
    <div>
        <button type = "button" data-bind = "click: ChangeOption">Option 2 please</button>
    </div>
</div>

我一直想知道绑定选择字段是否遵循这种强制值更改。事实证明这是按钮证明的(单击“更改选项”按钮后所选选项会更改)。

我相信密钥在Choice(currentChoice); 的某个地方。这会在与按钮一起使用时应用更改,而在动态加载选项时则不会。

是否可以保留选定的选项?

编辑: 事实证明,我(后来)测试过的每个浏览器(IE、Chrome 和 FF)都以不同的方式运行,即

  • Firefox(上面的描述是关于)最接近我的目标,
  • Chrome 打开时不会在我的视图中刷新选择选项列表。它需要被隐藏(单击)然后重新打开以显示加载的选项。与 FF 相比,这似乎很奇怪,
  • IE 只是在加载时关闭(隐藏)选择选项列表。这显然不是我的意思。

这就是为什么我现在的问题更像是:

是否可以在打开(显示)时将选项动态附加到选择?

而且,不幸的是,我可以用另一个 fiddle 来回答自己,这清楚地证明问题很简单:只有 Firefox 在显示选择时添加选项。

这让我问你:

什么是动态添加/加载内容到选择菜单的跨浏览器方法?

...这又是答案:没有这种可能性 (proper explanation)。所以现在我进入了自己的类似选择的控制。结束了

【问题讨论】:

  • 我很困惑。我的行为如下。开始时选择“opt1”。我点击下拉菜单。视觉上没有任何反应,“opt1”保持选中状态。我点击其他地方。没有任何反应,“opt1”保持选中状态。我重新打开下拉菜单,“opt1”仍然处于选中状态,现在我还看到“opt2”和“opt3”。根据您的问题,我认为您看到了不同的行为?
  • 附言。小提琴很棒,但如果您也将(相关位)代码添加到您的问题中,我们将不胜感激。这样,如果链接失效或 jsfiddle 失效,您的问题仍然对其他有相同问题的人有用。
  • @Jeroen 好吧,我只是觉得小提琴每次都足够了。无论如何,我犯的第一个错误是我只在 FF 中测试过,这是我描述的 FF 的行为。事实证明,每个 FF、Chrome 和 IE 的行为都不同(Chrome 将选项加载到数组中,但在打开时不刷新选择,而 IE 介于两者之间:它会打开一段时间,在将选项加载到数组时会关闭选择)但FF最接近我想要实现的目标。
  • 啊,是的,现在说得通了。不确定是否可能。 this question 在打开时向选择添加选项。 Q 和 A 的赞成票为零,但 A 可能仍然是正确的......
  • 答案中的链接已失效或..我不知道。我只是无法加载该链接。这仍然很好地解释了我的疑问。非常感谢。

标签: javascript knockout.js options html-select


【解决方案1】:

this other question 表明在选择打开时向其添加选项不太可能以良好的跨浏览器方式进行。

问题和答案都有 0 票,但我认为他们仍然是对的。你知道吗,我想我什至会去let empiricism do its thing(Chrome 和 IE10/9/8 会失败,FF 会没事)。

这意味着您必须将常规下拉菜单替换为 Select2Chosen jQuery 插件。

【讨论】:

  • 试图找到一些这样的控件但失败了。感谢您提供这些链接,我将仔细查看它们。我有点害怕我会用更复杂的方法替换我的 knockout.js 方法,但它仍然是我唯一的选择,我会试一试。再次非常感谢您。
  • 我试图把一个使用 Select2 做事的小提琴放在一起,但这并不是微不足道的(尽管可能很有可能)。您可能需要forcibly reload 或创建自定义 select2-binding 以直接操作 select2 数据。
  • 我相信我在上面也提供了这样一个小提琴,它证明了 FF 的力量。我仍将深入研究这两个 API 并采用更类似于绑定的控制。无论如何,这么简单的事情并不那么容易(没想到动态选择需要自定义)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2018-02-28
  • 2015-10-13
  • 1970-01-01
  • 2014-02-03
相关资源
最近更新 更多