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

标签 javascript backbone.js requirejs

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

window.app = ( window.app || {} );

在他们将模型定义和 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

我喜欢这种方法,因为它很简单,而且不必处理何时何地实例化一个集合。但是,首先使用 require.js 将代码分成小块,然后将所有代码一起分配给全局变量(除了全局变量在 javascript 中通常是错误的代码样式之外)似乎是错误的。

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

最佳答案

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

app = (app || {} );
app.Task = Backbone.Model.extend({ /*...*/ });
app.Tasks = Backbone.Collection.extend({ Model:app.Zask }); 

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

模型/Task.js

define(function () {
  return Backbone.Model.extend({ /*...*/ });
});

collections/Tasks.js

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

app.js

define([collections/Tasks], function (Tasks) {
  var tasks = new Tasks();
  tasks.fetch();
});

关于javascript - 将变量分配给 Backbone.js 中的窗口对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296302/

相关文章:

javascript - Chrome 开发工具在拒绝的 promise 上暂停,即使我正在捕获它

javascript - RequireJS 不加载依赖项

javascript - 获取 href 值 Angularjs

javascript - Extjs 如何将 JSON 文件夹结构加载到树中?

asp.net - 警报消息框问题

javascript - 未捕获的语法错误 : Unexpected token < on line 1 of http://localhost:25194/

javascript - @import 不适用于 Rails 项目中的 "application.css.scss"文件,仅适用于 "application.css"

javascript - 渲染后的主干布局管理器

angularjs - 仅在需要时动态注入(inject)模块

javascript - RequireJS,发布/订阅。如果没有糟糕的解决方法,我无法从 View 实例自己的方法访问 View 实例。