在值之后加载选项时,KnockoutJS会丢失之前的值

时间:2013-11-21 15:58:52

标签: javascript mvvm knockout.js

我正在通过AJAX请求提供我的选项,而值最初是在选择中。但是Knockout似乎删除了绑定选项中没有的值。

示例:http://jsfiddle.net/EVzrH/

Knockout似乎使用selectExtensions(第3行第1699行)来读取和写入所选选项。在此新值与索引匹配,并通过再次获取索引和匹配数据返回。

如何保存数据不会丢失?

4 个答案:

答案 0 :(得分:1)

一般来说,我通过使用当前值预先填充observableArray来处理这个问题(不需要文本,因为你还不太可能知道它。)

像:

var viewModel = {
    val: ko.observable(1),
    opts: ko.observableArray([{ Id: 1 }])
};

然后,让observableArray在返回时填充实际值。

对于更通用的解决方案,您可以使用本答案第二部分所述的自定义绑定:Knockout js: Lazy load options for select

这会为您预先填充observableArray,并考虑到您可能设置了optionsValue,也可能没有设置。

答案 1 :(得分:0)

我可以在这里看到2个可能的选项。首先是在应用绑定之前填充opts arrray:

var viewModel = {
    val: ko.observable(1),
    opts: ko.observableArray([])
};

viewModel.opts([
        { Id: ko.observable(1), Text: ko.observable("abc") }, 
        { Id: ko.observable(2), Text: ko.observable("someVal") }, 
        { Id: ko.observable(3), Text: ko.observable("other") }
    ]);
ko.applyBindings(viewModel);

这是小提琴:http://jsfiddle.net/EVzrH/1/

或者,如果由于某种原因在应用绑定之前无法填充它,您只需保存值并再次分配它:

var viewModel = {
    val: ko.observable(1),
    opts: ko.observableArray([])
};
var value = viewModel.val();
ko.applyBindings(viewModel);

viewModel.opts([
        { Id: ko.observable(1), Text: ko.observable("abc") }, 
        { Id: ko.observable(2), Text: ko.observable("someVal") }, 
        { Id: ko.observable(3), Text: ko.observable("other") }
    ]);
viewModel.val(value);

这是一个小提琴:http://jsfiddle.net/EVzrH/2/

答案 2 :(得分:0)

在填充选项后设置值,或订阅选项:

viewModel.opts.subscribe(function() {
    viewModel.val(1);
});

http://jsfiddle.net/gCyP6/

答案 3 :(得分:0)

我已经设法通过评论一些淘汰代码来避免ko.dependencyDetection.ignore以我想要的方式工作。

http://jsfiddle.net/EVzrH/3/

ko.bindingHandlers['value']['update'] = function (element, valueAccessor) {

ko.bindingHandlers['options']['update'] = function (element, valueAccessor, allBindings) {

唯一的问题是它没有缩小,因此切换到缩小的库不起作用。