淘汰赛:foreach数据未显示在HTML中

时间:2019-01-24 07:17:09

标签: javascript jquery html knockout.js

我想用html显示多维的可观察数组数据。但是,我没有得到输出。

我的代码:

<!-- ko if: ($parent.cust_opt_avail() === 1) -->
<!-- ko foreach: $parent.customVal() -->
<div class="product-custom-option-select">
    <p class="options-label" data-bind="text:key"></p>
    <p class="options-label" data-bind="text:custom_option_select_text"></p>
</div>
<!-- /ko -->
<!-- /ko -->

cust_opt_avail()是可观察的变量。 customVal 是可观察的数组。

customVal的输出是:

https://stackoverflow.com/a/20360774/922613

我想在第一个p标签上显示 custom_option_select_text 并显示名称。

如何做到?

预期结果:

enter image description here

请帮助我。

2 个答案:

答案 0 :(得分:1)

有趣的问题!因此,您想通过customVal()进行for循环,但是customVal()本身具有数组。在这种情况下,了解淘汰binding context很有用。特别是$data。您可以将其用作当前所在上下文的引用,而不必担心诸如颜色和​​大小之类的名称。

一旦您将$data用作Color和Size数组的占位符,也要在它们之间进行for循环。我创建了一个代码段:

var viewmodel = function(){
  var self = this;
  self.cust_opt_avail = ko.observable(1);
  var Color = [{'custom_option_select_text': 'Red + $200.00'},
                    {'custom_option_select_text': 'Green + $250.00'}];
  var Size = {'custom_option_select_text': 'XL + $150.00'};
  var customValArray = [Color, Size];
  self.customVal = ko.observableArray(customValArray);
};


ko.applyBindings(new viewmodel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<!-- ko if: (cust_opt_avail() === 1) -->
<div data-bind="foreach: customVal()">
  <!-- ko if: Array.isArray($data) -->
    <!-- ko foreach: $data -->
    <div class="product-custom-option-select">
        <p class="options-label" data-bind="text:custom_option_select_text"></p>
    </div>
    <!-- /ko -->
  <!-- /ko -->
  <!-- ko ifnot: Array.isArray($data) -->
    <div class="product-custom-option-select">
        <p class="options-label" data-bind="text:custom_option_select_text"></p>
    </div>
  <!-- /ko -->
</div>
<!-- /ko -->

答案 1 :(得分:1)

从您的previous question和此问题的注释中,我收集到您正在将一个对象设置为ko.observableArray()。这是不正确的。您应该将customVal设置为ko.observable()。然后使用Object.keys()并在foreach绑定中使用aliasing

var viewmodel = function() {
  var self = this;
  self.cust_opt_avail = ko.observable(1);
  
  let customVal = {
    Color: [{'custom_option_select_text': 'Red + $200.00'}, 
            {'custom_option_select_text': 'Green + $250.00'}],
    Size: {'custom_option_select_text': 'XL + $150.00'}
  };
  
  // This should be an observable
  self.customVal = ko.observable(customVal);
};

ko.applyBindings(new viewmodel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<!-- ko if: (cust_opt_avail() === 1) -->
<div data-bind="foreach: { data: Object.keys(customVal()), as: 'key' }">
  <div class="product-custom-option-select">
    <p style="font-weight:bold" data-bind="text:key"></p>

    <!-- ko if: Array.isArray($parent.customVal()[key]) -->
    <!-- ko foreach: $parent.customVal()[key] -->
       <p class="options-label" data-bind="text:custom_option_select_text"></p>
    <!-- /ko -->
    <!-- /ko -->
  
  <!-- ko if: !Array.isArray($parent.customVal()[key]) -->
  <p class="options-label" 
    data-bind="text:$parent.customVal()[key].custom_option_select_text"></p>
  <!-- /ko -->
</div>
</div>
<!-- /ko -->

注意:

由于customVal在嵌套上下文中,因此您可能必须在所有内部绑定中添加另一个$parent前缀。