javascript - 带有对象的多个 observableArray

标签 javascript html knockout.js

我有两个带有对象的 observableArray:

self.firstHorizontalLineArr = ko.observableArray([{color: "red", val: 0},{color: "blue", val: 1}]);
self.secondHorizontalLineArr = ko.observableArray([{color: "blue", val: 0},{color: "red", val: 1}])

用这些我创建一个像这样的observableArray:

self.testArr = ko.observableArray([{first: self.firstVerticalLineArr()},{second: self.secondVerticalLineArr()}]);

但是如果我现在这样做:

<div class="test" data-bind="foreach: testArr">
   <div data-bind="text: $data"></div>
</div>

那么$data只是{object Object]

如何获取 firstsecond 数组的值?例如,这样我就可以获得颜色?我想我需要第二个 foreach,但我不知道还有什么进一步的方法来实现这一点。

最佳答案

要回答所提出的问题几乎是不可能的,但我明白你的问题是什么。这是一种让事情变得更清晰的方法:

function ViewModel() {
  var self = this;
  self.firstHorizontalLineArr = ko.observableArray([{color: "red", val: 0},{color: "blue", val: 1}]);
  self.secondHorizontalLineArr = ko.observableArray([{color: "blue", val: 0},{color: "red", val: 1}])
  self.testArr = ko.observableArray([{first: self.firstHorizontalLineArr()},{second: self.secondHorizontalLineArr()}]);
}

ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<div class="test" data-bind="foreach: testArr">
  <strong>Original, but "toJSON" so you can see what it is:</strong>
  <div data-bind="text: ko.toJSON($data)"></div>
  <br>
  <strong>Demo 1, again "toJSON" to see what's going on:</strong>
  <div data-bind="foreach: !!$data.first ? $data.first : $data.second">
    <span data-bind="text: ko.toJSON($data)"></span><br>
  </div>
  <br>
  <strong>Demo 2, rendered:</strong>
  <div data-bind="foreach: !!$data.first ? $data.first : $data.second">
    <span data-bind="style: { color: color }, text: val"></span><br>
  </div>
  <hr>
</div>

但是,我建议合并稍微不同的数组,如下所示:

function ViewModel() {
  var self = this;
  self.firstHorizontalLineArr = ko.observableArray([{color: "red", val: 0}, {color: "blue", val: 1}]);
  self.secondHorizontalLineArr = ko.observableArray([{color: "blue", val: 0}, {color: "red", val: 1}])
  
  self.testArr = ko.computed(function() {
    return [{
      first: self.firstHorizontalLineArr(),
      second: self.secondHorizontalLineArr()
    }];
  });
  
  
  //[{first: self.firstHorizontalLineArr()},{second: self.secondHorizontalLineArr()}]
}

ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>

<script type="text/html" id="itemTmpl">
<li data-bind="style: { color: color }, text: val"></li>
</script>

<div class="test" data-bind="foreach: testArr">
  <strong>Demo 3, rendered:</strong><br>
  First:
  <ul data-bind="template: { foreach: first, name: 'itemTmpl' }"></ul>
  Second:
  <ul data-bind="template: { foreach: first, name: 'itemTmpl' }"></ul>
</div>

关于javascript - 带有对象的多个 observableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36550829/

相关文章:

javascript - Jquery ui datetimepicker 不适用于 knockout

javascript - HTML5 Canvas 笔划宽度不会增量变化

javascript - 选取多个属性

html - 如何在未设置高度的父 DIV 中适应 IMAGE?

javascript - knockout.js - 嵌套数组数据和级联预填充下拉列表绑定(bind)

javascript - 数据绑定(bind) "attr"不起作用(?)

javascript - 我如何在 JS 中将数字添加到变量中?

javascript - 使用 node.js 和 JavaScript 从 HTML 简单表单插入 MySQL 表

html - 在同一页面上将菜单项中的视频打开到 iframe 中

javascript - ng-model 在 Angular 1.3 中的输入类型编号上抛出错误