2

我目前有一个在父子关系中与自身相关的模型。我需要能够在页面上以树状结构显示这些(即嵌套<li>项目)。每个<li>项目都将具有一个底层 HTML 结构,该结构具有各种数据绑定和事件处理程序(全部使用Rivets.js实现)。

我最初的想法是使用 Rivets.js 创建一个组件,然后将其嵌套在自身中。但是,我似乎无法理解这些将如何初始化并插入到 DOM 中。

这是我希望能够做到的:

/** DATA LAYER **/
var item = {
    id: 1,
    title: "test item 1",
    description: "my description 1",
    someHandler: function () {
        console.log("handle something for Item 1");
    },
    items: [
        {
            id: 2,
            parentItem: 1,
            title: "test item 2",
            description: "my description 2",
            someHandler: function () {
                console.log("handle something for Item 2");
            },
            items: [

            ]
        },
        {
            id: 3,
            parentItem: 1,
            title: "test item 3",
            description: "my description 3",
            someHandler: function () {
                console.log("handle something for Item 3");
            },
            items: [
                {
                    id: 4,
                    parentItem: 3,
                    title: "test item 4",
                    description: "my description 4",
                    someHandler: function () {
                        console.log("handle something for Item 4");
                    },
                    items: [

                    ]
                }
            ]
        }
    ]
};

和表示层:

/** TEMPLATE **/
<div id="item_template"> <!-- accessed via <my-new-item></my-new-item> in HTML -->
    <li>
        <h4 rv-text="title"></h4>
        <p rv-html="description"></p>
        <button rv-click="someHandler">Click Me!</button>
        <ol>
            <my-new-item rv-each-item="items" item="item"></my-new-item>
        </ol>
    </li>
</div>

以及业务层:

rivets.components['my-new-item'] = {
  template: function() {
    return document.querySelector('#item_template').innerHTML;
  },
  initialize: function(el, data) {
    return data;
  }
}

rivets.init('my-new-item', document.querySelector('#page'), item);

有没有办法在 RivetsJS 中递归嵌套组件?

更新

我整理了一个 jsfiddle 来说明这一点。我似乎无法在递归期间让数据绑定工作。

https://jsfiddle.net/0mv4r8w0/4/

4

1 回答 1

3

好的,解决方法在这里:

https://jsfiddle.net/0mv4r8w0/5/

显然,我需要明确定义一个属性来访问数据。

模板更改为(注意我现在item.*用来访问属性):

<div id="item_template">
    <li>
        <h4 rv-text="item.title"></h4>
        <p rv-html="item.description"></p>
        <button rv-on-click="item.someHandler">Click Me!</button>
        <ol>
            <my-new-item rv-each-item="item.items" item="item"></my-new-item>
        </ol>
    </li>
</div>

并且rivits.init调用更改为(注意数据现在设置为属性):

rivets.init('my-new-item', document.querySelector('#page'), { item: item });
于 2016-02-09T18:31:19.553 回答