【问题标题】:Knockout.js foreach errorKnockout.js foreach 错误
【发布时间】:2017-07-21 19:04:31
【问题描述】:

TLDR:Knockout 在 foreach 上下文中不理解 options 中的绑定。

我有以下 HTML:

<!-- ko foreach: getModelData(123).Filters.Products.ORDER -->
        <div class="row Filter">
            <div class="col-7">
                <select required data-bind="options: $root.getModelData(123).DataSets.Products_ORDER,
                optionsText: $root.getModelData(123).DataSets.Products_ORDER.Text,
                optionsValue: $root.getModelData(123).DataSets.Products_ORDER.Field,
                value: Field"></select>
            </div>
            <div class="col-3">    
                <select required data-bind="value: Order"> 
                        <option value="" disabled selected>Choose...</option>
                        <option value="ASC">Ascending</option>
                        <option value="DESC">Descending</option>
                </select>    
            </div>
            <div class="col-2">
                <a href=""><img src="images/CmdDelete.svg" alt="remove" width="20" height="20"></a>
            </div>
        </div>
<!-- /ko -->

现在,getModelData(123) 是 viewModel 中的一个自定义函数,它绑定到整个事物。它基本上返回 viewModel 的一个子集。 伴随这个结构的数据是这样的:

{
Filters: {
  Products: {
    ORDER: [],
    WHERE: [],
    LIMIT: [],
    },
  someMoreDatasets...
},
DataSets:{
  Products: { /* some data, irrelevant for this */}
  Products_ORDER: [
    {Field: "value", Text: "Option 1"},
    {Field: "valu2", Text: "Option 2"}
    ]
  }
}

免责声明:这都是手工输入的,因此可能存在一些“文本错误”,但它们很可能不是我在页面上出现错误的原因,因为它都是从数据库中提取的。

想法是:

有一个按钮可让您向数据“添加更多过滤器”。 每当按下此按钮时,一个看起来像{Filter: "", Order: ""} 的新对象被推送到位于此处的可观察数组:Filters.Products.ORDER,该数组应包含有关客户端选择的过滤器的信息。同时,此 HTML 中的 select 绑定到位于此处的数组:DataSets.Products_ORDER 从中提取有关可能的选择选项的信息。

由于 foreach 绑定,这会为您的过滤创建一组新的 HTML 标记。它创建一个过滤器,如下所示。此过滤器是通过按下按钮创建的,因此 foreach 绑定有效。

这个下拉框甚至填充了正确数量的对象(尽管它们的显示不像预期的那样,所以这是 issue#1)这让我相信options 的选择是正确的,但是为什么深入 1 级时相同的语法不能正确显示,我不知道。

issue#2 出现在 bindingField 值中,当问题#1 得到解决时,它可能会自动修复。当add new filter 被按下时。淘汰赛会引发如下错误:

此绑定位于 foreach 循环中的同一 select 元素上,并且假定引用正在执行循环的元素。但是由于某种原因,整个对象都没有被看到,或者它不在上下文中。

有什么想法吗?

编辑:所以是的,通常......整天都在烦我,我一发布就发现了问题(至少部分)。 Field 绑定的东西是固定的。假设是Filter,因为用于绑定 foreach 的数据集确实有一个Field,而是一个Filter[Object object] 问题仍然存在,想法?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    这应该是您的选项绑定:

    <select required data-bind="options: $root.getModelData(123).DataSets.Products_ORDER,
                optionsText: 'Text',
                optionsValue: 'Field',
                value: Filter"></select>
    

    【讨论】:

    • 谢谢你的回答!部分修复但没有完全修复。即,select 不再显示 [Object object],但它也不显示文本。显示的值在 HTML 检查器中是正确的
    • 真的吗?你能得到一个小提琴吗?所以在检查器中你可以看到值,文本只是空白?
    • 检查器中的值是空白的,是的,但在这一点上,由于optionsValue 有效,我倾向于认为它更有可能是服务器/数据库问题。当他从发布休息回来时将与数据库管理员核实,然后报告
    • 将 $root.getModelData(123).DataSets.Products_ORDER 替换为 [ {Field: "value", Text: "Option 1"}, {Field: "value2", Text: "Option 2" } ] 去测试。我不认为淘汰赛不喜欢双点,并且在许多地方我不得不使用 withs 将其归结为属性,在您的情况下:选项:Products_ORDER
    • 好的,它就是这样工作的,所以很可能是数据集错误没有从数据库中获取正确的字段,但我无法检查,没有权限。就问题而言,此答案确实回答了原始问题,因此我将其标记为“已接受”。干杯
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 2012-04-12
    • 2012-06-10
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多