【问题标题】:Breadcrumb with Backbone.Marionette带骨干的面包屑。木偶
【发布时间】:2014-07-11 14:35:01
【问题描述】:

我正在尝试使用Marionette.CollectionViewMarionette.ItemView 实现面包屑导航。我想从模块的任何部分将面包屑添加到列表中。

这是我写的模块:

App.module("BreadcrumbModule", function(BreadcrumbModule){
var instance;

var Breadcrumb = Backbone.Model.extend({
    defaults:{
        link        : '',
        name        : ''            
    } 
});

BreadcrumbModule.BreadcrumbList = Backbone.Collection.extend({
    model : Breadcrumb
});

var BreadcrumbView = Marionette.ItemView.extend({
    tagName : 'li',

    render : function() {
        var liData = '';
        if(this.model.get('link') == '#') {
            liData = 'You are here: ';
        } else {
            liData = '<a href="#' + this.model.get('link') + '" class="tabSection">' + this.model.get('name') + '</a>';
        }

        $(this.el).html(liData);
        return this;
    }
});

BreadcrumbModule.BreadcrumbListView = Marionette.CollectionView.extend({
    tagName: "ul",
    id: "Breadcrumb",                

    itemView: BreadcrumbView,        

    initialize : function() {                       
        this.collection = new BreadcrumbModule.BreadcrumbList();                   

        this.collection.bind('add', this.appendBreadcrumb);       

        //this.collection.add({link: '#', name: 'You are here : '});
        this.listenTo(this.collection, "add", this.appendBreadcrumb);   
    },

    addBradcrumb: function(breadcrumbList){

        breadcrumbList.forEach(function(breadcrumb) {
            //console.log(breadcrumb);
            this.collection.add(breadcrumb);
        }, this);
    },      

    appendBreadcrumb: function(breadcrumb) {
        var breadcrumbView = new BreadcrumbView({
            model : breadcrumb
        });            

        $(this.el).append(breadcrumbView.render().el);
    }
});

// Singleton
BreadcrumbModule.getInstance = function() {
    if(!BreadcrumbModule.instance) {
        instance = new BreadcrumbModule.BreadcrumbListView();
    } 

    return instance;        
}        

});

我访问此模块的计划如下:

 //var breadcrumbs = []; 
 //breadcrumbs.push({link: 'book', name: 'Book'});

 //var breadcrumbListView = App.BreadcrumbModule.getInstance();

 var breadcrumb = new App.BreadcrumbModule.Breadcrumb({link: '#', name: 'You are here: '});
 var breadcrumbList = new App.BreadcrumbModule.BreadcrumbList();  
        breadcrumbList.add(breadcrumb);
 breadcrumbListView.addBradcrumb(breadcrumbs);

我可以看到默认的显示(“你在这里:”),当我添加新的面包屑时,“收藏”正在增长,但它没有反映在视图中。

可能是什么原因?

我该如何解决?

谢谢!

//圣。

【问题讨论】:

  • 您使用额外数组 (breadcrumbs) 的任何原因,然后您将其传递给 CollectionView 上的方法,而不是仅仅向集合本身添加新模型?您的 CollectionView 应该只是 listenTo 集合更改并重新渲染。
  • 我是 Backbone 的新手。我没有任何具体的理由来添加额外的数组,可能是我理解错了。我刚刚尝试了您在此处提到的内容,但没有奏效,可能我需要进行更多修改。我是否遵循正确的编码结构?你有任何工作样本吗?

标签: backbone.js marionette


【解决方案1】:

我在 JSFiddle 上写了一个简单的例子:http://jsfiddle.net/zaSvT/ 与您的代码的主要区别是:

CollectionView 正在监听它的集合,并在每次集合更改时重新渲染(例如

var BreadcrumbListView = Marionette.CollectionView.extend({
        el         : '#breadcrumbs',
        childView  : BreadcrumbItemView,
        initialize : function(){
            this.listenTo(this.collection, 'change', this.render );
            this.render();
        }
    });

在这里我只是用一个新的集合(从 1 个虚拟项目开始)实例化它:

var breadcrumbCollection = new Backbone.Collection([{ name : 'foo', url : 'foo' }]);

var breadcrumbView = new BreadcrumbListView({
    collection : breadcrumbCollection
});

当我向集合中添加新项目时,它会自动出现:

breadcrumbCollection.add({ name : 'foo', url : 'bar' });

【讨论】:

  • 非常感谢!我将分析您的方法并理解我的错误。
  • 我有一个问题:如果我想从模板文件中加载模板('#link_template')没有 RequireJS,我需要做什么修改?
  • 当我将此代码移动到模块(BreadcrumbModule)时,它显示错误消息“错误:必须指定“childView””
  • 您能在某处提供您的代码吗? JSFiddle?
  • JSFiddle : jsfiddle.net/Saneesh/cbYEL/5 这是我为模板文件编写的代码。我无法从视图中为模板中的 id 赋值。在我的模板文件中,如果有一个带有 id 'rate_select_template' 的 DIV 标签,我无法使用 $('#rate_select_template') 在 View 类中访问它,但如果我在主干.js 之前添加 DIV 标签它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多