【问题标题】:Knockout JS with Mappings recursive templating带有 Mappings 递归模板的 Knockout JS
【发布时间】:2015-09-02 23:22:20
【问题描述】:

我正在使用带有映射插件的淘汰赛 JS:

https://github.com/SteveSanderson/knockout.mapping/tree/master/build/output

我似乎无法访问数据。

这是一个纯敲除和纯 JSON 的工作示例:

http://jsfiddle.net/u0hv6wxe/2/

这是一个不完整的示例,其中敲除和映射不呈现任何内容:

http://jsfiddle.net/95zztzkq/1/

我使用映射的原因是为了防止创建具有来自 ajax 的数千个属性的模型。

插件文档:

http://knockoutjs.com/documentation/plugins-mapping.html

JS:

var initialData = {
    '@type': 'type1',
    'contents': [
        {
            '@type' : 'type2',
            'stringx': 'test'
        },
        {
            '@type' : 'type2',
            'stringx': 'test2'
        }
    ]
};
defaultData = ko.mapping.fromJS(initialData);
ko.applyBindings(defaultData);
console.log(defaultData['@type']());
console.log(defaultData.contents()[0]['@type']());
console.log(defaultData.contents()[1]['@type']());

模板:

<!-- ko template: { name: 'mainTemplate', data: $data } --><!-- /ko -->

<script id="mainTemplate" type="text/html">
    <!-- ko if: ($data['@type']=='type1') -->
            <div class="Page">
                PageTest
            <!-- ko if: ($data.contents) -->
                    <!-- ko template: { name: 'mainTemplate', foreach: $data.contents } -->
                    <!-- /ko -->
            <!-- /ko -->
            </div>
    <!-- /ko -->    
    <!-- ko if: ($data['@type']=='type2') -->
            <div class="test">
                StringTest <span data-bind="text: stringx"></span>
            </div>
    <!-- /ko -->    
</script>

我在这个问题上被困了 2 天,非常感谢所有帮助!

谢谢:)

【问题讨论】:

  • 在读取 view 中的值时使用 ()。它将解决问题在这里工作小提琴jsfiddle.net/95zztzkq/4
  • @supercool 我自己也得出了同样的结论——在表达式中访问 observable 时缺少括号,这似乎导致了这里的问题。我会把它作为答案发布
  • @JamesThorpe 是的,问题很小。嗯,我发布了答案:) 干杯

标签: javascript ajax knockout.js knockout-mapping-plugin


【解决方案1】:

在查看条件时,我们需要使用() 读取一个可观察值,这将解决问题

查看:

<!-- ko template: { name: 'mainTemplate', data: $data } --><!-- /ko -->

<script id="mainTemplate" type="text/html">
    <!-- ko if: ($data['@type']()=='type1') -->
            <div class="Page">
                PageTest
            <!-- ko if: ($data.contents) -->
                    <!-- ko template: { name: 'mainTemplate', foreach: $data.contents } -->
                    <!-- /ko -->
            <!-- /ko -->
            </div>
    <!-- /ko -->    
    <!-- ko if: ($data['@type']()=='type2') -->
            <div class="test">
                StringTest <span data-bind="text: stringx"></span>
            </div>
    <!-- /ko -->    
</script>

工作小提琴here

【讨论】:

  • 值得注意的是,这只是因为您正在访问复杂表达式中的可观察对象,即if: $data['@type']()=='type1'。如果它是一个 observable,它返回一个自己访问的布尔值,你可以选择是否有括号,例如 if: $data['bool']if: $data['bool']() 都可以。
  • 是的,在这种情况下同意。至于注意,在与 view/viewModel 中的其他值进行比较时,我们倾向于使用() #someUsefulInfo 供以后使用
  • 谢谢超酷! :)
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 2013-03-05
相关资源
最近更新 更多