显示/隐藏基于下拉选择在knockoutJS与模型内部的另一个模型

Show/Hide based on Dropdown selection in knockoutJS with model inside another model

本文关键字:模型 内部 另一个 knockoutJS 隐藏 于下拉 选择 显示      更新时间:2023-09-26

我正在为表单生成器"规则"工作。

我想显示/隐藏文本框基于下拉选择。

例如,让我们假设我们有以下"规则"用于"表单生成器"

下的"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"输入文本字段基于这个值。

我对此感到震惊。请帮我把这个弄掉。

Edit - 1: My Fiddle:

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

代码中的问题:

  • 可见绑定:selectedValueTextBoxViewModel中的属性,不是RuleConditionViewModel中的。因此,visible: ruleConditions().selectedValue()只能是visible: selectedValue
  • optionsValue: 'Value'绑定告诉knockout只存储规则条件的Value属性。即:它存储字符串isfilledoutcontains。删除它,整个对象将被存储。
  • 因为selectedItem是一个字符串,计算表达式this.selectedItem() && this.selectedItem().isExpressionValueRequired总是false: string原型没有一个名为isExpressionValueRequired的属性。
https://jsfiddle.net/hxchstp9/