javascript - 在 Knockout 中循环不同对象的数组 - 绑定(bind)错误

标签 javascript knockout.js

我正在尝试呈现页面的不同部分,并对单个数组中包含的不同项目应用适当的绑定(bind)。数组中的每个项目都可以具有不同的结构/属性。

例如,我们可以有 3 种不同的问题类型,与该问题相关的数据可以采用不同的格式。

JSON 数据

var QuestionTypes = { Textbox: 0, Checkbox: 1, Something: 2 }

var QuestionData = [
    {
        Title: "Textbox",
        Type: QuestionTypes.Textbox,
        Value: "A"

    },
    {
        Title: "Checkbox",
        Type: QuestionTypes.Checkbox,
        Checked: "true"
    },
    {
        Title: "Custom",
        Type: QuestionTypes.Something,
        Something: { SubTitle : "Something...", Description : "...." }
    }
];

JavaScript

$(document).ready(function(){
    ko.applyBindings(new Model(QuestionData), $("#container")[0]);
})

function QuestionModel(data){
    var self = this;

  self.title = ko.observable(data.Title);  
  self.type = ko.observable(data.Type);

  self.isTextbox = ko.computed(function(){
    return self.type() === QuestionTypes.Textbox;
  });

  self.isCheckbox = ko.computed(function(){
    return self.type() === QuestionTypes.Checkbox;
  });

  self.isSomething = ko.computed(function(){
    return self.type() === QuestionTypes.Something;
  });
}

function Model(data){
    var self = this;

  self.questionData = ko.observableArray(ko.utils.arrayMap(data, function(question){
    return new QuestionModel(question); 
  }));  
}

HTML

<div id="container">  
  <div data-bind="foreach: questionData">
    <h1 data-bind="text: title"></h1>

    <!-- ko:if isTextbox() -->
    <div data-bind="text: Value"></div>
    <!-- /ko -->

    <!-- ko:if isCheckbox() -->
    <div data-bind="text: Checked"></div>
    <!-- /ko -->

    <!-- ko:if isSomething() -->
    <div data-bind="text: Something">
      <h1 data-text: SubTitle></h1>
      <div data-text: Description></div>
    </div>
    <!-- /ko -->

  </div>
</div>

无论条件为真/假,都会应用 if 条件中的绑定(bind)。这会导致 JavaScript 错误...因为并非集合中的所有对象都具有“Value”属性等。

Uncaught ReferenceError: Unable to process binding "foreach: function (){return questionData }"
Message: Unable to process binding "text: function (){return Value }"
Message: Value is not defined

有什么方法可以防止绑定(bind)应用于错误的对象吗?

概念 JSFiddle:https://jsfiddle.net/n2fucrwh/

最佳答案

请在不更改代码的情况下查看更新的 Fiddler。仅在循环中添加 $data

https://jsfiddle.net/n2fucrwh/3/

 <!-- ko:if isTextbox() -->
<div data-bind="text: $data.Value"></div>
<!-- /ko -->

<!-- ko:if isCheckbox() -->
<div data-bind="text: $data.Checked"></div>
<!-- /ko -->

<!-- ko:if isSomething() -->
<div data-bind="text: $data.Something"></div>
<!-- /ko -->

在循环内部,您需要提供$data.Value。看来Value是与绑定(bind)冲突的 knockout 中的关键字。

关于javascript - 在 Knockout 中循环不同对象的数组 - 绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946933/

相关文章:

javascript 将参数传递给 object.keys

knockout.js - 当值保持不变时,如何强制 knockout 订阅?

javascript - Knockout.js 嵌套 foreach

javascript - 模板中被调用两次的 Knockout JS `hasFocus`

javascript - Knockout JS - 如何返回可观察字段的空字符串

javascript - 使用 jQuery .load 函数刷新元素而不重复它

javascript - Highcharts - 沿特定日期范围更改背景颜色

javascript - 数据表 fnDeleteRow 不更新每页结果

html - 绑定(bind) HTML 5 音频 src

javascript - 如何使用 vscode 设置 jest typescripts 测试以在 Debug模式下运行