我的marionette.js应用程序中的循环引用出现问题。
问题是:
App.js创建带有控制器的路由器,该控制器再次需要app.js,以便可以将视图添加到区域。正如您在下面(控制器)看到的那样,当我打印Application时,由于循环引用,它返回undefined。
controller.js:
define(
['app', 'views/ProjectItemView'],
function (Application, ProjectItemView)
{
'use strict';
console.log(Application); // undefined
return Marionette.Controller.extend({
showProjects : function()
{
Application.main.show(new ProjectItemView());
console.log('project');
}
});
}
);router.js:
define
(
['marionette'],
function(Marionette)
{
'use strict';
return Marionette.AppRouter.extend
(
{
appRoutes:
{
'dashboard/projects' : 'showProjects'
}
}
);
}
);app.js
define
(
[
'backbone', 'marionette', 'jquery', 'routers/DashboardRouter', 'controllers/DashboardController',
'views/dashboard/Header'
],
function(Backbone, Marionette, $, DashboardRouter, DashboardController, Header)
{
'use strict';
var app = new Marionette.Application();
app.addRegions({
header: '#header',
main: '#main',
});
app.header.show(new Header());
app.on('initialize:after', function () {
Backbone.history.start({pushState: true});
app.router = new DashboardRouter({
controller : DashboardController
});
});
$(document).on("click", "a[href^='/']", function(event)
{
var href = $(event.currentTarget).attr('href');
console.log(href);
event.preventDefault();
app.router.navigate(href, {trigger: true});
return false;
});
return app;
}
);现在,解决这个问题的最好方法是什么?我是个新手,所以我真的不知道最好的实践是什么。
另外,我在控制器中添加视图是正确的吗?或者我应该在别的地方做呢?
提前感谢
发布于 2013-06-13 01:03:32
我认为你应该将一个区域传递给控制器来实例化它,你肯定需要移动你的代码。我有一个示例应用程序,但不使用require,但是在控制器中创建一个区域并将一个区域从主应用程序传递到它的概念可以在这里演示。
App.addInitializer(function () {
var controller = new BookStoreController({region: App.mainRegion});
layout = new CatalogLayout();
controller.region.show(layout);
var router = new Router({controller:controller});
});http://jsfiddle.net/rayweb_on/hsrv7/11/
希望这能有所帮助。
发布于 2013-06-13 11:25:09
如果我理解正确的话,基本上,你有路由器依赖于应用程序和控制器依赖于应用程序。
如果是这样的话,您只需将它们分为三个模块: App、Router和Controller。然后定义'app',...在路由器和控制器模块中。Here是我在JMQ中使用的其他一些基本代码结构。
更新:来自Using-marionette-with-requirejs,它还讨论了“避免循环依赖”
发布于 2013-06-13 09:58:27
您可以将ProjectView放入木偶模块中。
有关这种技术的示例,请参考https://github.com/mallim/backbone_examples/blob/master/app/scripts/cats/module.js。
希望这能有所帮助。
https://stackoverflow.com/questions/17069337
复制相似问题