backbone.js应用程序范围的功能,不依赖于特定的控制器/模型

时间:2012-04-04 17:32:03

标签: jquery backbone.js javascript

我正在使用骨干样板,您可以找到here

我想知道如何添加全局功能,它没有明确地绑定到任何特定的集合,模型,视图等。例如,“注销”功能可能如下所示:

var logout = function(){
  // Clear Favorites
  // Handle asynchronous logging (all in-app logs are sent to the server at logout)
  // Redirect to the login page
  // Do other cleanup
}

基本上,这将处理众多模型/集合,包括FavoritesEventsLogsUsers和应用程序Router

如果您查看主干 - 样板中的main.js文件,我一直在顶部(第13行)添加这些函数,如下所示:

function(namespace, $, Backbone, Example){

  // BEGIN MY APP LOGIC
  namespace.app.logout = function(){
    // Do logout here
  };
  // END MY APP LOGIC

  var Router = Backbone.Router.extend({

这很好用,但应用程序逻辑很快就会失去控制。我的问题是,组织这段代码的更好方法是什么?如果我有一个Utils模块并加载了Utils模块,它会更有意义吗?

干杯!

3 个答案:

答案 0 :(得分:8)

TLDR:http://addyosmani.github.com/backbone-fundamentals/高级部分。

让它成为可能,然后让它美丽,然后快速。

随着您的应用程序的发展和使事情发生(可能),很明显哪些功能属于一起。相应地将它们分成模块(漂亮)。

我使用require.js,但不使用backbone-boilerplate(bb也有AMD分支)。我组织我的应用程序的方式正如您所描述的那样,我有一个具有通用应用程序内容的utils模块。然后我将auth,Notification和Date格式化内容添加到utils模块。然后我将utils模块包含在我懒惰的地方,并希望我的所有util函数都可用。

由于它们都只是模块/ mixins,我还可以在我需要的任何单个模块中包含auth / notification / date模块。

答案 1 :(得分:3)

我在backbone.js应用程序中遇到了同样的问题。我最终做的与您的建议相似,创建了具有特定全局功能的View(如Utils模块)。

如果您希望保持对此“Utils”类的引用与其耦合,您可以绑定到事件队列,并根据消息进行处理。例如,对于注销功能,您可以将“注销”消息发布到事件队列,并从“Utils”视图中绑定到该事件队列。这种方式无论在哪里调用,消息都会传递给正确的函数。要调用注销功能,您只需将“注销”消息发布到事件队列即可。

如果你的课程变得非常大,这可能会让人感到困惑,但我建议只放置全球需要的功能。

更新:作为一个更强大的解决方案,您可以将您的实用程序功能直接构建到主干本身。文档说明:

“因为它(骨干)作为您应用程序的基础,您需要以您认为合适的方式扩展和增强它 - 整个源代码都经过注释,以便您更轻松。”

我发现通过添加到主干对象,您可以增强内置的实用功能(noConflict和setDomLibrary),以包含诸如注销之类的内容。就像任何Javascript函数一样,您可以初始化必要的变量,然后像

一样调用它们
    Backbone.logout();

答案 2 :(得分:3)

我将这些放入应用程序视图中。当它变得太大(我的个人限制为600-800行)时,您通常能够将大多数这些全局方法组合成几个逻辑上合理的辅助模块,以使应用程序视图保持足够小。