Динамически созданные селекты не привязываются к их наблюдаемым значениям? - PullRequest
0 голосов
/ 03 октября 2018

Я динамически создаю выборки в нокауте следующим образом:

<h5 data-bind="visible: selectedChildren() > 0">@Model.SelectChildrenAge</h5>
  <input type="hidden" name="ac1" data-bind="value: selectedChildrenAgesCsv()"/>
  <div class="children-age-container__ages" data-bind="foreach: childrenAges">
       <select class="children-age-container__ages--select" data-bind="options: $data, optionsCaption: 'Age', value: $parent.selectedChildrenAges[$index]"></select>
   </div>

В моей модели я массив observableArray, к которому нужно привязать динамически создаваемое значение выбора:

selectedChildrenAges: KnockoutObservableArray<number> = ko.observableArray([
        0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0
    ]);

Однако,кажется, что они всегда равны 0, даже если фактическое создание селектов работает как шарм.Проблема здесь в том, что я не хочу публиковать то, что есть в полях выбора, как есть, бэкэнд требует, чтобы я публиковал это как строку CSV.Что я сделал, так это создал метод подписки, который обновит selectedChildrenAgesCsv соответственно:

this.selectedChildrenAges.subscribe(() => {
            console.log((this.selectedChildrenAges as any).join(", "));
            this.selectedChildrenAgesCsv((this.selectedChildrenAges as any).filter(age => age > 0).join(","));

Мой журнал консоли никогда ничего не выводит здесь, и я вроде как потерян, как с этим справиться.Я пробовал так много разных способов, но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 03 октября 2018

selectedChildrenAges - это наблюдаемый массив.Чтобы получить его содержимое, вы должны использовать ():

this.selectedChildrenAges.subscribe(() => {
            console.log((this.selectedChildrenAges() as any).join(", "));
            this.selectedChildrenAgesCsv((this.selectedChildrenAges() as any).filter(age => age > 0).join(","));
});

или использовать newValue, который приходит в качестве аргумента в функции обработчика подписки:

this.selectedChildrenAges.subscribe((newValue: Array<number>) => {
            console.log(newValue.join(", "));
            this.selectedChildrenAgesCsv(newValue.filter(age => age > 0).join(","));
});

Или вы можете использовать computed:

this.selectedChildrenAgesCsv = ko.computed<string>(() => {
    return this.selectedChildrenAges().filter(age => age > 0).join(",");
});
...