1

我正在使用附加到窗口的变量:

window.App

作为我的应用程序中其余变量的参考点。但是,当我尝试这样做时:

window.App = {};

App.Views.User.Login = /* Login View Instance */;

它会抱怨Views没有被定义。这在大多数情况下都很好,因为我可以预定义App.Views, App.Models, App.Collections等。

但是,当我们进入并不总是需要的子模块(App.Views.User)时,我希望在需要时加载它......

以下是唯一的选择吗?

if( ! App.Views.User ) { App.Views.User = {}; };

App.Views.User.Login = /* Login View Instance */;
4

2 回答 2

2

我会像这样开始你的子模块:

App.Views.User = App.Views.User || {};
App.Views.User.Login = new Backbone.Marionette.ItemView.extend({});

只比你已经拥有的干净一点,但这通常是你所做的。

于 2012-11-27T22:55:56.080 回答
0

就像是:

namespace("myapp.mymodule.submodule.component",{});

在哪里:

function namespace (ns, module, optional_root) {
    var root = optional_root || window,
        array = ns.split("."),
        name = "",
        component_name = array.pop(),

        i = 0, l = array.length;

    for (; i < l; i += 1) {
        name = array[i];
        root[name] = root[name] || {};
        root = root[name];
    }

    root[component_name] = module;
}

这应该允许您编写:

namespace("Appname.module.component", {});

函数期望找到的位置window.Appname,或类似:

namespace("module.component", function(){}, Myapp);

如果它不存在,则通过定义modulein来告诉它开始。Myapp

唯一的缺点是该函数必须在加载模块之前存在。

于 2012-11-27T23:36:44.557 回答