javascript - 主干 : rendering tree data and updating on changes

标签 javascript backbone.js marionette backbone-views backbone-events

我从服务器获取某种树数据(仅用于示例):

[
    {
    nodeName: "top level 1",
    nodes: [
        {
        nodeName: "2nd level, item 1",
        nodes: [
            {
            nodeName: "3rd level, item 1"}
        ]}
    ]},
{
    nodeName: "top level 2",
    nodes: [
        {
        nodeName: "2nd level, item 3",
        nodes: [
            {
            nodeName: "3rd level, item 7"},
        {
            nodeName: "3rd level, item 8"},
        {
            nodeName: "3rd level, item 9"}
        ]}
    ]}
]​

为了渲染这个,我使用 Backbone.Marionette.CollectionView 和 Backbone.Marionette.CompositeView http://jsfiddle.net/AdWjU/179/ (以下derickbailey's article)。

但是我需要每 300 秒轮询一次服务器,它可以返回更改后的树:

[
    {
    nodeName: "top level 1",
    nodes: [
        {
        nodeName: "2nd level, item 1",
        nodes: [
            {
            nodeName: "3rd level, item 1"},
            {
            nodeName: "new name"} // changed
        ]}
    ]},
{
    nodeName: "top level 2",
    nodes: [
        {
        nodeName: "2nd level, item 3",
        nodes: [
            {
            nodeName: "3rd level, item 7"},
        {
            nodeName: "3rd level, item 8"},
        {
            nodeName: "3rd level, item 9"},
        {
            nodeName: "3rd level, item 10"} // added
        ]}
    ]}
]​

现在我只需调用 tree.update(data) 即可重新渲染整个数据。

如何仅更新依赖于已更改属性的 View ?

我正在尝试减少重新渲染的 View 。我应该使用 CompositeViews 还是尝试诸如 Backbone 关系模型之类的东西来完成此任务?

最佳答案

由于您每次初始化时都会重建集合,因此每当您调用 update 时,您都会从头开始删除并重新创建节点树。

为了保留您的节点树,您必须同步从主干服务器获取的树。最直接的方法是创建与 nodeName 一起传递的唯一 id,并以此为基础构建模型和集合。然后你可以重写这个:

if (nodes) {
  this.nodes = new TreeNodeCollection(nodes);
  this.unset("nodes");
}

进行查找以查看您的节点是否存在并将其附加到相关集合,而不是将其清除并重新创建。

关于javascript - 主干 : rendering tree data and updating on changes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14161641/

相关文章:

javascript - 将模板与主干 js 结合使用

javascript - 如何使用 JavaScript 突出显示并保存 HTML 中的文本?

javascript - 不知道 id 时如何获取嵌入对象?

javascript - 使用 or 运算符匹配字符串的一部分

javascript - 如何跟踪 Marionette.LayoutView 中输入的更改

javascript - 使用 RequireJS 和 JSDoc3 记录 Marionette 模块

backbone.js - Marionette.CompositeView 如何在不使用任何模型的情况下将参数传递给模板

Javascript - 在循环中使用字符串数组

javascript - Backbone : Collection nested in a model

javascript - 哪个 javascript 框架与 twitter bootstrap 一起使用?