【问题标题】:Custom Mapping entire Array自定义映射整个数组
【发布时间】:2023-04-07 08:55:01
【问题描述】:

我正在尝试使用 Knockout 应用自定义映射。我有一个包含这个 JSON 片段的 JSON 对象:

{
    "feature": { "id": "BEAM_TYPE2" },
    "label": { "ux_value": "BEAM_TYPE", "tooltipText": "" },
    "help": { "ux_title": "BEAM_TYPE_HELP", "ux_value": "BEAM_TYPE_DESCRIPTION" },
    "control": { 
         "type": "dropdown", 
         "options": [
             { "ux_value": "BEAM_TYPE_BOX", "value": "BOX" }, 
             { "ux_value": "BEAM_TYPE_IBEAM", "value": "IBEAM" }, 
             { "ux_value": "BEAM_TYPE_PFC", "value": "PFC" }, 
             { "ux_value": "BEAM_TYPE_OPEN", "value": "OPEN" }, 
             { "ux_value": "BEAM_TYPE_ZTYPE", "value": "ZTYPE" }, 
             { "ux_value": "BEAM_TYPE_BOX_ANGLE", "value": "BOX_ANGLE" }, 
             { "ux_value": "BEAM_TYPE_STEP", "value": "STEP" }
         ], 
         "value": "BOX" 
    }
}

最终options 被转换为可观察数组并绑定到下拉列表。但是我现在决定我实际上想要动态地改变这个数组中的值,而是提供一个计算函数,所以一个虚拟的硬编码示例:

ko.computed(function() {
    return [
       { ux_value: "A", value: "A" },
       { ux_value: "B", value: "B" },
       { ux_value: "C", value: "C" }
    ];
});

我决定在ko.mapping 中使用自定义绑定是最好的方法,所以我尝试使用创建函数:

var mapping = {
        'options': {
            create: function (options) {
                debugger;
            }
        }
    };

不幸的是,我发现我为数组中的每个项目都命中了断点,所以在显示的示例中,我会命中断点 7 次,而我只想命中一次并返回结果对象.处理此问题的正确方法是否适用于 control 而不是 options 并为所有其他值手动创建绑定,还是有更简单的方法?

【问题讨论】:

  • 选项对象将如何以及何时动态变化?
  • @NathanFisher 计算值可能会在绑定后的任何时间点发生变化。本质上将添加一条规则,其他可观察对象将更改可用选项

标签: knockout.js


【解决方案1】:

您可以尝试上移一层并为控件属性创建一个映射函数。

var mapping = {
        'control': {
            create: function (control) {
                debugger;
            }
        }
    };

并将计算函数添加到其中。

【讨论】:

  • 是的 - 我确实在我的问题中注意到这是一种可能性,但有效的答案。我想我是想避免这样做,因为那时我需要手动处理所有其他属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多