【问题标题】:Knockout : foreach data not display in HTML淘汰赛:foreach 数据不在 HTML 中显示
【发布时间】:2019-06-17 20:50:25
【问题描述】:

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

我的代码:

<!-- 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() 是 ko 可观察变量。 customVal 是 ko 可观察数组。

customVal 的输出是:

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

怎么做?

预期结果:

请帮帮我。

【问题讨论】:

  • 试试ko foreach: $parent.customVal().Color
  • 但是,我想同时获取颜色和大小的 custom_option_select_text 值。
  • 你好@aseferov。你有什么发现吗?

标签: javascript jquery html knockout.js


【解决方案1】:

从您在这个问题中的previous question 和 cmets,我推测您正在将对象设置为 ko.observableArray()。这是不正确的。您应该将customVal 设置为ko.observable()。然后在 foreach 绑定中使用 Object.keys() 并使用 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 前缀。

【讨论】:

  • 嘿阿迪加。片段看起来很完美。但是,customVal 如何使其动态化?因为,您看到我以颜色推送数据。可以在 ko observable 中做吗?像 ko 可观察数组一样吗?
  • 我怎样才能像 let customVal 一样制作动态数组?你能帮帮我吗?
  • @KevalMehta 这似乎完全是一个不同的问题。以前工作的一切现在必须与ko.observable 一起工作。除非您添加了一些变通方法来使 ko.obsrvableArray() 与对象一起工作。 “动态”到底是什么意思?每当您将另一个对象推送到 customVal()['Color'] 时,它不会反映在 UI 中?
  • 其实customVal()在初始化的时候是空白的。现在,当我检查收音机时,Size 元素应该创建并添加适当的值。然后,我选中了 2 复选框。所以,那时应该是创建颜色元素并添加适当的值。
  • 我现在创建的。 var customVal = {}。现在,如何推动价值?我确实喜欢 customVal.push(value) 或 customVal.Size.push(value) 它总是会返回 push is not function。
【解决方案2】:

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

一旦您使用$data 作为颜色和大小数组的占位符,也可以对它们执行 for 循环。我创建了一个 sn-p:

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 -->

【讨论】:

  • 如你所见,如果尺寸数据得到然后显示尺寸数据,然后显示所有颜色值等。你能像这样剪掉吗?
  • 嗨,Ray,你签入我的代码了吗? 如果我写了这一行,那么它就不起作用了。但是,如果我写 那么,我可以获得 Color 元素的数据。我哪里做错了?
  • 查看我更新的 sn-p.. 无法按照您的意愿使用键,因为数组不存储具有自定义键名的值。它们仅按索引存储。我已经看到你在this question 中所做的事情,但是如果你看到你的 customVal 数组的大小,我认为它会是 0,即使它里面有 Size 和 Color。
  • 不,不,兄弟。我可以这样设置自定义键值: self.customVal()['Size] = array_value;不过,让我试着回答你。如果您得到预期结果的解决方案,请更新 sn-p。
  • 我已经试过这个 self.customVal()['Size] = array_value.之后,如果您执行 console.log(self.customVal().length),它将显示为 0。这不是将元素添加到数组的正确方法。这就是向 object 添加属性的方法。因为数组是一种对象。 For 循环不适用于此。
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 2019-02-14
  • 2014-12-16
  • 2015-05-28
  • 2016-03-12
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多