【问题标题】:Asyncronous knockout observableArray select options loading异步淘汰 observableArray 选择选项加载
【发布时间】:2014-11-16 16:11:54
【问题描述】:

我有一个 selectOptions 基于 ajax 的 asincronous 加载器;它接受远程地址并返回一个可观察数组,正确填充描述和键值,以供以下绑定接受

 <select data-bind="value: selectedVal, options: opts, optionsText: 'desc', optionsValue:'key', optionsCaption: ''"/></div>

事实是,当我触发一个选择选项更改时,基于一些用户操作,我将其分配给我的模型可观察数组,我没有得到填充,而是保持为空。

 mymodel.opts = loadOptions("<remoteaddress>");

我知道当调用第二行时 anwer 还没有到达,但返回的值是一个 observableArray,所以它应该在填充时正确响应,已分配给与 ui 绑定的 observable 数组。

如果我硬编码从 ajax 调用(返回时)返回的对象,从 Firefox 中的 console.log 获取它,或者如果我将 observable 数组 opts 传递到 loadOptions,并更改它以在其中构建 opts,然后它可以工作,但我真的需要按原样使用 loadOptions,asincronous。我也尝试附加 mymodel.opts.valueHasMutated(),但 ko 无法使用新到达的 observableArray。

如果可能保持选项加载器不变,并且如果可能不使用自定义绑定,我可以使用传入的 observable 数组在它准备好时进行绑定吗?

【问题讨论】:

    标签: javascript ajax knockout.js ko.observablearray html-select


    【解决方案1】:

    你遇到的问题是当这条线运行时:

    mymodel.opts = loadOptions("<remoteaddress>");
    

    它用 不同 observableArray 替换整个可观察数组,而不是更新当前数组。您需要更新现有的 - 您可以更改 loadOptions 以返回一个普通数组,而不是一个可观察的数组吗?然后你可以这样做:

    //clear any existing entries
    mymodel.opts.removeAll();
    //push the new entries in
    mymodel.opts.push.apply(mymodel.opts, loadOptions("<remoteaddress>"));
    

    【讨论】:

    • 无法更改。但即使我可以,如果它返回一个不可观察的,在异步调用时它将是空的,所以我不会加载任何选项。它与分配 mymodel.opts(loadOptions("")()); 相同。它不会填充选项,即使 ajax 稍后正确返回对象
    • 啊我想我明白了 - 它返回的 observableArray 会在以后更新吗?代码中有model.opts = loadOptions...,是在调用applyBindings 之前吗?
    • 如果是这种情况,我认为您需要展示loadOptions 本身在做什么——我认为问题可能出在那儿
    • 嗯,ajax 响应稍后进来,但不会更新 observable 数组(所以 UI)。加载器在 applyBindings 调用之后被调用,模型被加载并且功能正常,但是如果用户点击一个按钮,或者另一个,选择填充不同的记录。加载器只是向服务器询问一个 json 对象,该对象由 [{"desc":"description", "key":key"}... 的数组组成,它们被一个一个推入(进入 $.each 循环)到加载器内新创建的 observableArray 中,然后返回。我现在没有可用的代码。
    • 听起来它每次更新时都会创建一个新的observableArray,以及在调用初始applyBindings之后 - 这不会像页面一样工作在applyBindings 点绑定到原始数​​组被调用。您需要以 same observableArray 更新的方式对其进行重组,而不是每次都创建一个新的
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2013-03-11
    • 2017-04-28
    相关资源
    最近更新 更多