异步淘汰observableArray选择加载选项

Asyncronous knockout observableArray select options loading

本文关键字:加载 选项 选择 observableArray 淘汰 异步      更新时间:2023-09-26

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

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

事实是,愚蠢的是,当我根据一些用户操作触发选择选项更改时,我会将其分配给我的模型可观察数组,我不会弹出选择,但保持为空。

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

我知道当第二行被调用时,anwer还没有到达,但返回的值是observableArray,所以无论何时填充,它都应该正确响应,因为它被分配给了与ui绑定的observable数组。

如果我从Firefox中的console.log中获取ajax调用返回的对象(当它返回时),或者如果我将可观察数组opts传递到loadOptions中,并对其进行更改以在其中构建opts,那么它就可以工作了,但我真的需要按原样使用loadOptions,愚蠢。我还尝试附加mymodel.opts.valueHasMutted(),但ko无法使用新到达的observableArray。

如果可能的话,保持选项加载程序不变,如果可能,不使用自定义绑定,我可以在准备好时使用传入的可观察数组进行绑定吗?

您遇到的问题是,当这行运行时:

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>"));