我如何管理Backbone应用程序?

时间:2013-09-26 07:16:40

标签: javascript backbone.js

我试图围绕Backbone,更具体地说是一个应用程序如何在整个生命周期中流动。不幸的是,在我的工作中,我无法访问(或就此而言)我们的API的结构。我们有不同时期的不同来电,结构疯狂不一致。

覆盖提取或同步对于标准化返回并不是一个问题,但是我遇到的问题(在我在Backbone应用程序中潜入的最开始)是如何布局实际代码。

这是我的真实世界的例子。此页面非关键,我正在尝试使用Backbone重新编写它。这是流程:

  1. Page加载来自通话
  2. 的流派类型列表
  3. 点击一个流派类型根据流派类型加载子流派(子流派类型需要一个流派代码作为参数)
  4. 点击子流派类型会加载符合该条件的所有产品。
  5. 我可以走得很远,但在某些时候我觉得代码被破坏了 - 或者感觉不自然。就像我在推进一样。

    所以我的官方问题是:如何管理Backbone应用程序?

    以下是我的过程摘要:

    我创建了一个全局命名空间,应该

    var App = App || {};
    

    好的,让我们从主应用程序视图开始,如所有示例所示:

    App.MainView = Backbone.View.extend({
       //this loads the outer stuff
       //and creates an instance of the Genre View
    });
    

    好吧非常简单,我需要一个流派模型,集合和视图(这也适用于子流派)

    App.Genre = Backbone.Model.extend();
    
    App.Genres = Backbone.Collection.extend({
      url: 'returns a list of genres',
      model: App.Genre,
      initialize: function() {
        this.fetch();
      },
      fetch: function() {
        var self = this;
    
        $.ajax({
          url: this.url,
          success: function(response) {
            **format return**
            self.add(formattedArrayOfModels);
          }
        });
      }
    });
    

    现在进入视图,令人困惑的部分

    App.GenreView = Backbone.View.extend({
      el: 'element',//easy enough
      tmpl: 'my handlebars template',//implementing handlebars...no problem
      initialize: function() {
        //this produces a collection full of genres
        this.genreList = new App.Genres();
        this.genreList.on('add', _.bind(this.render, this));
      },
      render: function() {
        //rendering not a problem, pretty straight forward
      }
    });
    

    直到这里我没有问题。类型列表加载,我们很高兴。所以,现在当用户点击一个类型时我希望它加载一个子类型

    events: {
      'click a': 'getSubGenres'
    },
    getSubGenres: function(e) {
    
    }
    

    这是我的问题。在 getSubGenres 中,我是否将其保留在本地?

    var subGenre = new App.SubGenreView();
    

    或者我应该将其作为流派观点的一部分吗?

    this.subGenre = new App.SubGenreView();
    

    我应该以某种方式将它放在父对象中,以便其他视图可以访问它吗?我如何控制这样的事情?

    如果我已经有一个子类型的集合,我如何使用加载的集合(而不是另一个ajax调用)。

    这是你要使用的方法吗?

1 个答案:

答案 0 :(得分:1)

在我回答之前,有几件事情, 第一:fetch函数不需要$ ajax调用,因为它是它的工作,因此,你可以在fetch中立即评估error:function(){}success:function(){},但这是假设URL设置正确。 第二:在我的主干键盘头部战斗中帮助了我很多的一件事就是addy osmani Backbone Fundamentals,其中包含一个非常丰富的pdf格式的教程。

现在回到这个问题:根据我的经验,你将主要需要'这个',所以习惯它是一个很好的习惯,如果正确实施,有一些东西可以解决很多这些问题:{{3 }}

无论如何,决定放置子视图的位置,完全取决于您的设计决策,并且很大程度上取决于您如何构建页面和文件。

关于如何使用预加载的“集合”:我真的没有得到它,因为你所谈论的集合包含所有子类,所以通常它不应该改变,即使视图变为a某种类型的视图,你仍然可以使用它。

但我所说的一切,都与你如何构建你的文件有关,我做了一个app.js和一个router.js以及很多其他文件,但主要的工作总是在主要的两个,所以基本上我总是获取所有内容。

我希望这能回答你的问题