As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




7年前关闭。




我目前正在将Backbone视为一种组织我们的javascript文件并为我们的代码创建干净结构的方法。

我的问题主要是“最佳实践”问题。

该库运行良好,并且我已经成功地使用AMD和requirejs设置了结构。我的问题与我正在运行的几个实用程序文件有关。人们从XML文档获取数据并将其转换为json数据对象(以便可以对数据进行本地化)。另一个是加载并连接到Facebook的实用程序。我将它们都创建为“模型”。

可以说这些模型在连接到服务时可能应该是“ Controller ”,但是无需浏览到路由器(或 Controller )文件中的hashbang,就可以调用它们。

我应该为这两个实用程序文件扩展主干模型还是要实现这样的实用程序文件?

最佳答案

为此目的,使用Backbone.Model绝对没有错,但是不管它感觉如何。模型带有额外的行李,这些行李不属于“服务”或“实用程序”类型类。

取而代之的是,我为功能定义了一个更通用的,事件化的基类,该基类不太适合“ Backbone 模型- View -集合-路由器”范例。

define(['backbone', 'underscore'], function(Backbone, _) {

  var Class = function() {
    this.initialize.apply(this, arguments);
  };

  //give Class events and a default constructor
  _.extend(Class.prototype, Backbone.Events, {initialize: function() {}});

  //copy the extend feature from one of the backbone classes
  Class.extend = Backbone.Model.extend;

  return Class;
});

该类的行为类似于其他Backbone对象,因为它可以被extend编码,其实例具有initialize构造函数方法,并且它们支持事件。您的示例之一,本地化服务可能类似于:
var LocalizationService = Class.extend({
  initialize: function(url) {
    this.url = url;
    this.fetch();
  },

  fetch: function({
    var self = this;
    $.ajax({
      url:this.url,
      success: function(response) {
        self.response = response;
        self.trigger('fetch:complete', self, response);
        //etc...
      }
    });
  }
});

07-24 17:15