knockout.js - 将 ko.component 嵌套在 component.template 中

标签 knockout.js nested components

我正在尝试使用 knockout.js 构建基于 jquery 的树查看器库 ( https://github.com/davewood/treejo )

我构建了一个组件,并希望在其自己的模板中使用该组件。

几乎可以工作,但在初始化嵌套组件时出现了奇怪的错误。

如果您打开控制台,此 JSFiddle 会演示该问题。 http://jsfiddle.net/tyx89ude/8/

我必须将 knockout.js 复制并粘贴到 javascript 窗口中(向下滚动以查看我的代码),因为如果我通过 jsfiddle 加载 knockout,则 ko.components 函数不可用。

ko.components.register('node', {
    viewModel: function (params) {
        console.log(params);
        var self = this;
        self.title = ko.observable(params.title);
        self.url = params.url;
        self.body = ko.observable(params.body);
        self.classes = ko.observable('node node-closed');
        self.children = ko.observableArray(params.children);
        self.load = function () {
            var data1 = {
                'title': "title1",
                    'body': "body1",
                    'url': "url1"
            };
            var data2 = {
                'title': "title2",
                    'body': "body2",
                    'url': "url2"
            };
            self.children.push(data1);
            self.children.push(data2);
            self.classes('node node-open');
        };
        self.children.subscribe(function (data) {
            console.log(data)
        });
    },
    template:
        '<div data-bind="css: classes">\
            <div class="node-panel">\
              <div class="node-heading">\
                <a class="node-toggle" data-bind="click: load">&gt;</a>\
                <span class="node-title" data-bind="text: title"></span>\
              </div>\
              <!-- ko if: body -->\
              <div class="node-body" data-bind="text: body"></div>\
              <!-- /ko -->\
            </div>\
            <div class="node-content" data-bind="if: children().length > 0">\
              <div data-bind="attr: { title: title }" class="node-closer"><div></div></div>\
              <div data-bind="foreach: { data: children(), as: \'child\' }"></div>\
                <div data-bind="component: { name: \'node\', params: child }"></div>\
              </div>\
            </div>\
          </div>'
});

更新:正确的 JSFiddle。 http://jsfiddle.net/tyx89ude/26/谢谢弗拉德

最佳答案

您的模板标记有错误

更改:

<div data-bind="foreach: { data: children(), as: \'child\' }"></div>\

<div data-bind="foreach: { data: children(), as: \'child\' }">\

关于knockout.js - 将 ko.component 嵌套在 component.template 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129064/

相关文章:

javascript - 计算 knockout 渲染组件的宽度

javascript - 将 Knockout 可观察属性绑定(bind)到 Bootstrap 单选按钮值失败

javascript - 使用 Knockout JS 部分映射到现有对象

<label> 内的 HTML 标签

sql - 如何查询 postgres json 列中的嵌套数组?

javascript - React Native 中首先触发的是什么?

javascript - 奇怪的数据绑定(bind)问题

html - <strong><a> 还是 <a><strong>?

java - Spring MVC 3 有 View 组件吗?

c++ - 在通用编程/TMP 世界中,模型/策略和 "concept"究竟是什么?