Показать / скрыть на основе выбора раскрывающегося списка в KnockoutJS с моделью внутри другой модели

Я работаю над «Правилами» для конструктора форм.

Я хочу показать/скрыть текстовое поле на основе выбранного раскрывающегося списка.

Например, предположим, что у нас есть следующие «Правила» для элемента управления «TextField» в «Построителе форм».

Rule#   Control(dropdown)          Condition(dropdown)          Value(as input textbox)

1       TextBox_1                    Is filled out             (Text Input NOT REQUIRED)

2       TextBox_2                        Contains                         Hi

Исходя из вышеизложенного, для правила 1 ввод текста не требуется, а для правила 2 требуется ввод текста.

Выше мой сценарий.

Что я пробовал:

HTML-контент:

 //Dropdown for "Condition"

  <select 
          class="form-control" 
          data-bind="
                     value: selectedValue
                     options: ruleConditions().options(),
                     optionsText: 'Name', 
                     optionsValue: 'Value',
                     optionsCaption: 'Choose condition'">
  </select>


 //Input text field for "Value"

<input 
      type="text" 
      class="form-control" 
      data-bind="visible: ruleConditions().selectedValue()" />

Контент KnockoutJS:

У меня есть две модели просмотра.

1) FormViewModel

2) TextBoxViewModel

Кроме того, у меня есть один массив, который содержит options для раскрывающегося списка.

И моя реализация выглядит следующим образом:

//Options Available in Array

var RuleConditionArray = {

// Options for "Text Field" under Rules tab

textFieldConditions: ko.observableArray
         (
           [
             { 
               Name: 'is filled out', 
               Value: 'isfilledout', 
               isExpressionValueRequired: false 
             },

             {
               Name: 'contains', 
               Value: 'contains', 
               isExpressionValueRequired: true
             }
           ]
        )
};

//Form View Model
function FormVM() {
    var self = this;

    self.textBoxVM = ko.observable(new TextBoxViewModel(Id,Name));
}

//TextField View Model
function TextBoxViewModel(Id, Name) {
var Txt = this;

Txt.CommonProperties = new CommonViewModel(Id, Name);

// Initialize Rule Conditions from Array.
Txt.ruleConditions = ko.observable(new RuleConditionViewModel(RuleConditionArray.textFieldConditions()));

Txt.selectedItem = ko.observable();

Txt.selectedValue = ko.computed(function () {
    return this.selectedItem() && this.selectedItem().isExpressionValueRequired
}, this);

}

formView = new FormVM();
ko.applyBindings(formView);

Что я получаю:

Из приведенного выше кода я могу заполнить раскрывающийся список значениями.

Что я не получил:

Я не могу show/hide Value ввести текстовое поле для "Правил". Мне нужно получить значение isExpressionValueRequired и показать/скрыть текстовое поле ввода "Value" на основе этого значения.

Я поражен этим. Пожалуйста, помогите мне избавиться от этого.

Редактировать - 1: Моя скрипка:

https://jsfiddle.net/vikash208/z4x5meua/3/


person Vikash    schedule 26.10.2016    source источник
comment
Вам не хватает привязки данных value: selectedItem в элементе <select>?   -  person user3297291    schedule 26.10.2016
comment
Я пробовал. Но не работает. Я пробовал разные решения от StackOverflow и jsFiddle. Например, я попробовал это решение в jsFiddle link , которое лучше всего подходит для моего подхода но не мой сценарий.@user3297291   -  person Vikash    schedule 26.10.2016
comment
Не могли бы вы увеличить баллы, чтобы многие пользователи могли увидеть этот вопрос и быстро решить его?   -  person Vikash    schedule 26.10.2016
comment
Лучший способ получить быстрый ответ — создать скрипт или фрагмент стека, в котором достаточно кода, чтобы воспроизвести вашу проблему.   -  person user3297291    schedule 26.10.2016
comment
Спасибо. Я создам и расскажу вам о скрипке в ближайшее время.   -  person Vikash    schedule 26.10.2016
comment
Я создал скрипку и обновил свой вопрос как Edit -1, который присутствует внизу вопроса. Пожалуйста, найдите его. @user3297291   -  person Vikash    schedule 26.10.2016
comment
Это должно работать так: jsfiddle.net/hxchstp9? Если это так, я напишу ответ, чтобы объяснить, что не работает.   -  person user3297291    schedule 26.10.2016
comment
Да, конечно. Большое спасибо. Не могли бы вы объяснить?   -  person Vikash    schedule 26.10.2016


Ответы (1)


Проблемы в вашем коде:

  • Видимая привязка: selectedValue является свойством в TextBoxViewModel, нет в RuleConditionViewModel. Поэтому visible: ruleConditions().selectedValue() должно быть только visible: selectedValue
  • Привязка optionsValue: 'Value' указывает, что Knockout сохраняет только свойство Value условия правила. То есть: он хранит строку isfilledout или contains. Удалите его, и весь объект будет сохранен.
  • Поскольку selectedItem было строкой, вычисляемое выражение this.selectedItem() && this.selectedItem().isExpressionValueRequired всегда было ложным: прототип string не имеет свойства с именем isExpressionValueRequired.

https://jsfiddle.net/hxchstp9/

person user3297291    schedule 26.10.2016
comment
Большое спасибо. - person Vikash; 26.10.2016
comment
У меня есть вопрос. Как я могу сопоставить выбранное значение с раскрывающимся списком, что-то вроде параметров редактирования? @user3297291 - person Vikash; 26.10.2016
comment
Я не понимаю, что вы имеете в виду. - person user3297291; 26.10.2016
comment
Теперь, если я хочу установить значения для раскрывающегося списка через модель. Я думаю, что это невозможно с value в data-bind . Потому что мы храним весь объект под value - person Vikash; 26.10.2016
comment
Вам нужно будет установить его на один из объектов в ruleConditions().options(). Например: Txt.selectedItem(ruleConditions().options()[0]) - person user3297291; 26.10.2016
comment
Я работаю над этим. Как только я закончу, я сообщу вам, получу ли я решение или нет. Спасибо чувак. Большая помощь. - person Vikash; 26.10.2016
comment
Не удалось заполнить значение в раскрывающемся списке значением по умолчанию. Вот моя скрипка, пытающаяся заполнить значение при загрузке с помощью RuleConditionArray[0]. [ссылка]jsfiddle.net/vikash208/uawcgo6f/1 . Также у меня есть вопрос, что делать, если я сохранил, не выбирая данные? Выдает ошибку, когда я сохраняю данные, ничего не выбирая. - person Vikash; 28.10.2016
comment
Вы создаете модель представления для каждого параметра, поэтому вам нужно будет выбрать модель представления: Txt.selectedItem = ko.observable(Txt.ruleConditions().options()[0]); (jsfiddle.net/usa9h1Ls) - person user3297291; 28.10.2016
comment
Но у меня есть вопрос: что, если я сохранил, не выбирая данные? Мой сценарий таков: теперь я сохраняю данные, ничего не выбирая. После сохранения выдает ошибку KnouJS, в которой говорится, что Unable to bind Message: selectedItem не определен. Что это означает ? - person Vikash; 28.10.2016
comment
Сохранение модели представления в JSON и ее перезагрузка — это совсем другая тема. Взгляните на плагин ko.mapping. Если вы столкнетесь с какими-либо конкретными проблемами, задайте новый вопрос. Удачи! - person user3297291; 28.10.2016
comment
Спасибо, приятель. Я придумаю другую тему. - person Vikash; 28.10.2016
comment
Привет. Вот моя скрипка [ссылка]jsfiddle.net/vikash208/6b6ntoam/19. Попытка выбрать раскрывающийся список с помощью selectedCondition. Но не работает. Это моя фактическая модель, которую я использую в своем приложении. - person Vikash; 31.10.2016