knockout.js 按需加载选择选项,同时保留加载前的选择状态

uinbv5nw  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(122)

开始,这里有一个fiddle来说明我的观点。
我有一个带有选择字段的简单表单。一开始我只预先加载了一个已选择的选项,我想在单击选择字段时加载其余的选项。这样做很好,除了在将这些选项加载到observableArray选项中时,“Choose”默认选项标题被占用,即使我在加载前保存了选择,然后尝试恢复它。
剧本是这样的

(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只是在加载它们时关闭(隐藏)选择选项列表。这显然不是我的观点。

这就是为什么我现在的问题更像是:
is it possible to dynamically append options to a select while it is opened (shown)?
不幸的是,我可以用另一个fiddle来回答我自己,它清楚地证明了问题就是这么简单:只有Firefox会在显示select时添加选项。
这让我问你:
what is a cross-browser method to dynamically add/load content into a select menu?
......答案也是:没有这种可能性proper explanation)。所以现在我进入了自己的选择类控制。Over 'n out

6yoyoihd

6yoyoihd1#

有一个this other question建议,在select打开时向其添加选项是不太可能的,这是一个良好的跨浏览器方式。
问题和答案都有0个赞成票,但我认为他们是正确的。你知道吗,我想我甚至会去和let empiricism do its thing(Chrome和IE10/9/8将失败,FF将是好的)。
这意味着您必须用Select2Chosen jQuery插件之类的插件来替换常规下拉列表。

相关问题