将变量分配给Backbone.js中的窗口对象

tma*_*ini 4 javascript requirejs backbone.js

我正在开发一个很大的Backbone.js应用程序.代码采用模块化结构require.js.现在我看到很多骨干代码和教程这样做:

window.app = ( window.app || {} );
Run Code Online (Sandbox Code Playgroud)

之后,他们会将模型定义和Collection实例分配给该全局对象,如下所示:

Task = Backbone.Model.extend({ /*...*/ });
Tasks = Backbone.Collection.extend({ /*...*/ }); 

window.app.Task = Task;
window.app.Tasks = new Tasks();
// do this with all your models and collections
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方法,因为它简单,不必处理实例化集合的地点和时间.但是,首先将代码require.js分配到一个全局变量(除了全局变量通常是javascript中的错误代码风格)之后,首先将代码分成小位似乎是错误的.

那你对此有何看法,这种方法的优点和缺点是什么?你如何在Backbone中处理你的对象?

And*_*rle 6

首先,污染全局名称空间并不是一个大问题,因为您可以将所有模型包装在自己的命名空间中:

app = (app || {} );
app.Task = Backbone.Model.extend({ /*...*/ });
app.Tasks = Backbone.Collection.extend({ Model:app.Zask }); 
Run Code Online (Sandbox Code Playgroud)

当涉及到requirejs时,它取决于你的项目的大小.我认为对于较小的项目,你可以不用.使用requirejs的好处不是防止命名空间污染,它的可维护性更好,因为你总能看到模块的依赖关系.您可以编写更好的单元测试,因为您可以测试模块并模拟其所有依赖项.因此,我们从上面的示例结构重建一个大型Backbone应用程序,如下所示:

车型/ Task.js

define(function () {
  return Backbone.Model.extend({ /*...*/ });
});
Run Code Online (Sandbox Code Playgroud)

收藏/ Tasks.js

define([models/Task], function (Task) {
  return Backbone.Collection.extend({ Model:app.Task }); 
});
Run Code Online (Sandbox Code Playgroud)

app.js

define([collections/Tasks], function (Tasks) {
  var tasks = new Tasks();
  tasks.fetch();
});
Run Code Online (Sandbox Code Playgroud)

  • 仍然在requirejs中使用`app`变量是常规的吗? (2认同)