我正在通过AJAX
请求提供我的选项,而值最初是在选择中。但是Knockout
似乎删除了绑定选项中没有的值。
Knockout
似乎使用selectExtensions
(第3行第1699行)来读取和写入所选选项。在此新值与索引匹配,并通过再次获取索引和匹配数据返回。
如何保存数据不会丢失?
答案 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);
});
答案 3 :(得分:0)
我已经设法通过评论一些淘汰代码来避免ko.dependencyDetection.ignore
以我想要的方式工作。
ko.bindingHandlers['value']['update'] = function (element, valueAccessor) {
ko.bindingHandlers['options']['update'] = function (element, valueAccessor, allBindings) {
唯一的问题是它没有缩小,因此切换到缩小的库不起作用。