Żywam opcje OFF żądanie AJAX, podczas gdy wartość jest początkowo w wyborze. Jednak Knockout wydaje się usuwać wartości, które nie są w opcjach na wiązaniu.

Przykład: http://jsfiddle.net/evzrh/

Knockout wydaje się używać selectExtensions (linia 1699 V3), aby odczytać i napisać wybraną opcję. W tym nowych wartościach są dopasowane do indeksów i zwrócone ponownie, otrzymując indeks i dopasowywanie do danych.

Jak mogę uratować moje dane przed zgubieniem?

1
Tim 21 listopad 2013, 19:58

4 odpowiedzi

Najlepsza odpowiedź

Ogólnie rzecz biorąc, radzę sobie z tym przez prepumulowanie obserwujbearray z bieżącą wartością (nie ma potrzeby tekstu, ponieważ jeszcze nie wiesz jeszcze).

Lubić:

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

Następnie pozwól, aby observablearray zostanie wypełniona rzeczywistymi wartościami, gdy powróci.

Aby uzyskać bardziej ogólne rozwiązanie, można użyć niestandardowej wiązania, jak opisano w drugiej części tej odpowiedzi: Knockout JS: Lazy Opcje ładowania do wyboru

Wypełniłoby to dla Ciebie obserwablearray i wziąć pod uwagę, że możesz mieć lub nie ma zestawu optionsValue.

2
Community 23 maj 2017, 10:25

Widzę tutaj 2 możliwe opcje. Po pierwsze, aby wypełnić tablicę OTS przed zastosowaniem wiązań:

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

Oto skrzypce: http://jsfiddle.net/evzrh/1/

Lub jeśli z jakiegoś powodu nie można go wypełnić przed zastosowaniem powiązań, możesz zapisywać wartość i przypisać go ponownie:

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

Oto skrzypce: http://jsfiddle.net/evzrh/2/

0
Artem Vyshniakov 21 listopad 2013, 16:05

Albo ustaw wartość po wypełnieniu opcji lub subskrybuj opcje:

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

http://jsfiddle.net/gcyp6/

0
sroes 21 listopad 2013, 16:06

Udało mi się to uruchomić sposób, w jaki chciałem, skomentując niektóre z krajenia, aby uniknąć ko.dependencyDetection.ignore.

http://jsfiddle.net/evzrh/3/

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

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

Tylko problem polega na tym, że nie jest ono minility, więc przełączenie na bibliotece włączniczej nie działa.

0
Tim 21 listopad 2013, 16:59