Backbone.history已经启动

时间:2011-09-09 14:13:28

标签: javascript backbone.js

我在Backbone.js应用上收到错误“Backbone.history已经启动”。这是我的代码。

(function ($) {
    // model for each article
    var Article = Backbone.Model.extend({});

    // collection for articles
    var ArticleCollection = Backbone.Collection.extend({
        model: Article
    });

    // view for index page
    var MainView = Backbone.View.extend({
        el: $('#wrapper'),
        render: function (){
            var template = Handlebars.compile($("#main_hb").html());
            $(this.el).find('#main_content').html(template);
            return this;            
        }   
    });

    // view for listing blog articles
    var ArticleListView = Backbone.View.extend({
        el: $('#wrapper'),
        render: function(){
            var js = this.model.toJSON();
            var template = Handlebars.compile($("#articles_hb").html());
            $(this.el).find('#main_content').html(template({articles: js}));
            return this;    
        }
    });

    // main app
    var ArticleApp = Backbone.Router.extend({
        // setup routes
        routes: {
            ""  : "index",
            "blog"  : "blog"
        },          
        index: function(){
            var main = new MainView({});
            main.render();
            return this;
        },          
        blog: function(){
            $.ajax({
                url: 'blogs/articles', 
                dataType: 'json',
                data: {},
                success: function(data)
                {
                    var articles = new ArticleCollection(data);
                    var view = new ArticleListView({model: articles});
                    view.render();
                }       
            });
            return this;
        }

    });

    // let's start the app!
    articleApp = new ArticleApp();
    Backbone.history.start();

})(jQuery);

应用程序本身似乎工作正常。但Chrome中的错误很神秘。

7 个答案:

答案 0 :(得分:8)

2013年12月30日更新:看起来这可能是一个常见问题,我决定大胆说明原因。

我遇到了同样的问题并解决了它。原因是我

<强> imported the js file twice

因此,我建议您检查包含此脚本的页面,看看它是否已经两次引入。

答案 1 :(得分:3)

Yujings说对了!它导入了两次js。 更新 我的#34;修复&#34; (绝对是一种解决方法)是把它放在路由器中。

Backbone.history.stop();
Backbone.history.start();

可能不是最理想的,但它以天真的方式完成了工作。

答案 2 :(得分:1)

由于我的Rails 4应用程序中的Turbolinks,我遇到了同样的问题。 这种解决方法帮助了我。也许它对你也有帮助:

initialize: ->
  new MyApp.Routers.Posts
  Backbone.history.start() unless Backbone.History.started
  $(document).on "page:change", ->
    Backbone.history.stop()
    Backbone.history.start()

在此处找到此答案:https://github.com/codebrew/backbone-rails/issues/134

答案 3 :(得分:0)

您的代码似乎没问题。你确定你加载了一次吗?如果你把history.log()放在history.start()之前,那么日志是否只打印一次?

一般情况下,当多次调用history.start()时会出现此错误。我担心你需要找到第二个电话。您在此处发布的代码不足以找到它。

答案 4 :(得分:0)

我遇到了这个问题,因为我在 application.js 文件中执行了 require_tree。,并且我预先编译了我的资产。

如果您要在 application.js require_tree。,请检查您是否没有公共/资源文件>文件。

答案 5 :(得分:0)

如果您正在使用requirejs,请检查您的脚本是否包含自身 - 只需在start时添加console.error()调用并查看它出现的次数。我得到了它,因为我将优化配置复制到线性执行。

答案 6 :(得分:-3)

试试这个:

   articleApp = new ArticleApp();
   Backbone.history = Backbone.history || new Backbone.History({});
   Backbone.history.start();