5

我正在使用骨干模板,您可以在此处找到。

我想知道如何添加全局功能,它不明确绑定到任何特定的集合、模型、视图等。一个例子是“注销”功能,它可能看起来像这样:

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 模块,它会更有意义吗?

干杯!

4

3 回答 3

8

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

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

随着您开发应用程序并使事情正常运行(可能),哪些功能属于一起将变得显而易见。将它们相应地分成模块(漂亮)。

我使用 require.js,但不使用骨干样板(bb 也有 AMD 分支)。我组织应用程序的方式与您描述的完全一样,我有一个具有通用应用程序内容的 utils 模块。然后,我将 Auth、Notification 和 Date 格式化内容添加到 utils 模块。然后我在任何我懒惰的地方都包含 utils 模块,并希望我的所有 util 函数都可用。

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

于 2012-04-10T04:31:50.767 回答
3

我在我的backbone.js 应用程序中遇到了同样的问题。我最终所做的与您的建议类似,创建一个具有特定全局函数的视图(如 Utils 模块)。

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

如果你的类变得非常大,这可能会让人感到困惑,但我建议只放置全局需要的函数。

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

“因为它(骨干)作为应用程序的基础,所以你应该以你认为合适的方式扩展和增强它——整个源代码都经过注释,使你更容易做到这一点。”

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

    Backbone.logout();
于 2012-04-04T18:16:33.910 回答
3

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

于 2012-04-06T21:04:45.520 回答