【问题标题】:Show/Hide based on Dropdown selection in knockoutJS with model inside another model显示/隐藏基于敲除JS中的下拉选择,模型位于另一个模型中
【发布时间】:2016-10-26 07:11:29
【问题描述】:

我正在为表单生成器制定“规则”。

我想根据选择的下拉菜单显示/隐藏文本框。

例如,假设我们在“Form Builder”下的“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/hideValue“规则”的文本输入字段。我需要获取isExpressionValueRequired 的值并根据该值显示/隐藏“Value”输入文本字段。

我对此感到震惊。请帮我摆脱这个。

编辑 - 1:我的小提琴:

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

【问题讨论】:

  • 您的&lt;select&gt; 元素中是否缺少value: selectedItem 数据绑定?
  • 我试过了。但不起作用。我尝试过来自StackOverflowjsFiddle 的不同解决方案。例如,我在 jsFiddle link 中尝试了这个解决方案,它最适合我的方法,但不是我的场景.@user3297291
  • 能不能加分,让很多用户看到这个问题,快速解决?
  • 获得快速答案的最佳方法通常是创建一个 fiddle 或 stack sn-p,其中包含足够的代码来重现您的问题。
  • 谢谢。我很快就会创建并让您了解小提琴。

标签: javascript jquery html knockout.js formbuilder


【解决方案1】:

代码中的问题:

  • 可见绑定:selectedValueTextBoxViewModel 中的属性,不是 RuleConditionViewModel 中的属性。因此,visible: ruleConditions().selectedValue() 应该只是visible: selectedValue
  • optionsValue: 'Value' 绑定告诉 knockout 仅存储规则条件的 Value 属性。即:它存储字符串isfilledoutcontains。移除它,整个对象就会被存储起来。
  • 因为selectedItem 是一个字符串,所以计算出的表达式this.selectedItem() &amp;&amp; this.selectedItem().isExpressionValueRequired 始终为假:string 原型没有名为isExpressionValueRequired 的属性。

https://jsfiddle.net/hxchstp9/

【讨论】:

  • 非常感谢。
  • 我有一个问题。如何将所选值映射到类似于编辑选项的下拉列表? @user3297291
  • 我不明白你的意思。
  • 现在如果我想通过模型设置下拉列表的值。我认为在 data-bind 中使用 value 是不可能的。因为,我们将整个对象存储在value
  • 您必须将其设置为ruleConditions().options() 中的对象之一。例如:Txt.selectedItem(ruleConditions().options()[0])
猜你喜欢
  • 2013-09-16
  • 2018-04-15
  • 2016-02-21
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多