【问题标题】:Backbone Marionette : Add a model (and render its view) to a nested Composite ViewBackbone Marionette:将模型(并渲染其视图)添加到嵌套的复合视图中
【发布时间】:2014-06-25 00:51:32
【问题描述】:

如果您不想看到完整的代码,这就是我想要做的。 我有多个页面,每个页面都有多个标签。有一个名为 PageManyView 的复合视图用于渲染页面,称为它的 childView PageView。 Page View 是一个嵌套的复合视图,它呈现标签,将 this.model.get('tags') 作为集合传递。

现在我可以使用 pages.add(newPage) 轻松添加新页面。这里的页面是集合。 我在添加新标签时遇到问题。我怎样才能做到这一点。请帮忙。

代码

var PageModel = Backbone.Model.extend({});

var PageCollection = Backbone.Collection.extend({
    model: PageModel
});

我在 /data 端点的 JSON 是这样来的

[
  {
    _id: '1', 'name': '1', info: 'Page 1',
     tags: [{name:'main', color:'red'}, {name:'page', color:'blue'}]
  },
  {
    _id: '1', 'name': '2', info: 'Page 2',
     tags: [{name:'section', color:'blue'} {name:'about', color:'yellow'}]
  }
]

我在 Marionette 中创建了这样的嵌套视图:

TagView = Marionette.ItemView.extend({
   template: '#tagOneTemplate'
});

PageView = Marionette.CompositeView.extend({
    template: '#pagesTemplate',
    childViewContainer: 'div.tags',
    childView: EntityViews.TagView,
    initialize: function(){
        var tags = this.model.get('tags');
        this.collection = new Backbone.Collection(tags);
    }
});

PageManyView = Marionette.CompositeView.extend({
     template: '#pageManyTemplate',
     childView: EntityViews.PageView,
     childViewContainer: 'div#all-pages'
});

现在这是我面临问题的地方。在我的应用程序的 Controller 中,假设我是否必须添加一个新页面

showPages: function(){
   //Getting pages by using jQuery deferred
    var view = PageMainView({collection:pages});
    view.on("add:page", function(){
       var newPage = Page({_id: 3});
       pages.add(newPage);
    });

}

现在这个添加函数会自动呈现新页面。

但我在添加新标签时遇到了问题。如何添加新标签?

【问题讨论】:

  • 你的PageView 应该监听模型的变化并重置它的标签集合。然后,您可以轻松地将新标签添加到页面集中的任何模型中。

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


【解决方案1】:

终于成功了。这是我所做的。 第 1 步:从页面集合中获取当前模型(页面)。

var currentpage = pages.get(pageid);

第 2 步:使用 Marionette BabySitter 获取我要插入新标签的页面的视图。

var v = view.children.findByModel(currentpage);

第 3 步:将标签添加到 v.collection。由于 v 是我要插入新标签的页面的视图,因此 v.collection 返回初始化的标签集合

v.collection.add(tag);

这对我有用。让我知道我是否在某个地方错了或存在更好的方法。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这可以很容易地通过改变你的集合的传入方式来完成。而不是在你的复合视图中设置集合的初始化,你应该在实例化过程中直接传递它。这样,当您从模型中更改集合时,compositeView 将听到集合上的“添加”事件并自动为您添加节点

    例如,它可能看起来像这样。

    PageView = Marionette.CompositeView.extend({
        template: '#pagesTemplate',
        childViewContainer: 'div.tags',
        childView: EntityViews.TagView,
    });
    
    new PageView({
      model: myModel,
      collection: myModel.get("tags")
    });
    
    myModel.get("tags").add([{new: "object"}])
    

    【讨论】:

    • 但这怎么可能。我的意思是我得到了页面集合,我直接将其呈现为 var view = PageMainView({collection:pages});将视图添加到我的木偶区域。您建议的方式是调用 PageView 而不是 PageMain View。这意味着我必须遍历页面中的每个模型,然后渲染 PageView。在这种情况下,页面 _id、名称和信息将如何显示?我从不实例化 PageView。相反,我正在实例化 PageManyView 并渲染它。我错过了什么吗? @samccone
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多