Marionette 路由器没有在路由上触发控制器方法
Marionette router not triggering controller method on route
我正在尝试从 Marionette 1.* > 2.4.2 升级应用程序。此更改的最大部分是从 Marionette 模块转变为使用 Browserify/Watchify CommonJS 样式模块。
我在尝试 Router/Controller 和 运行 时遇到了障碍。没有抛出错误,但由于某些原因,我的路由没有触发我的控制器方法。
doc_router.js:
var $ = require('jquery')
, _ = require("underscore")
, Backbone = require("backbone")
, Marionette = require("backbone.marionette")
, App = require("../../app.js")
var Router = Marionette.AppRouter.extend({
appRoutes: {
"docs": "listDocs"
}
});
// Map to controllers
var API = {
listDocs: function () {
console.log("listDocs") // Doesnt log to console
App.DocApp.List.Controller.listDocs();
}
};
// Update the URL when a controller event
// that requires it is triggered, then call
// appropriate controller via API.
App.on("docs:list", function () {
App.navigate("docs");
API.listDocs();
});
// Initialize router when app starts
App.on("before:start", function () {
console.log("History started? ", Backbone.History.started);
console.log("Initializing router...")
new Router({
controller: API
});
});
module.exports = Router;
app.js:
var $ = require('jquery')
, _ = require("underscore")
, Backbone = require("backbone")
, Marionette = require("backbone.marionette")
var App = new Marionette.Application();
App.addRegions({
mainRegion : "#main-region",
modalRegion : "#modal-region"
});
App.on("start", function () {
if (Backbone.history) {
console.log("Application starting...");
var fetchingCurrentUser = App.request("entities:current-user");
$.when(fetchingCurrentUser).done(function (current_user) {
App.currentUser = current_user;
console.log("Starting history...");
Backbone.history.start();
console.log("History started? ", Backbone.History.started);
});
}
});
module.exports = App
main.js:
var _ = require('underscore');
var App = require('./app.js');
App.Entities = _.extend({},
require("./entities/doc.js"),
require("./entities/user.js")
);
// DocsApp
App.DocsApp = {
"Router": require("./apps/doc/doc_router.js"),
"Reader": {
"Controller": require("./apps/doc/reader/doc-reader_controller.js"),
"Views": require("./apps/doc/reader/doc-reader_views.js")
},
"List": {
"Controller": require("./apps/doc/list/doc-list_controller.js"),
"Views": require("./apps/doc/list/doc-list_views.js")
}
};
App.start();
从我的控制台日志来看,我似乎没有在创建路由器之前启动 Backbone.history。真的把我的头发拉到这个......任何帮助表示赞赏。
编辑
使用 Backbone.Router 似乎有效(如下)。为什么 Marionette.AppRouter 不起作用?
var Router = Backbone.Router.extend({
routes: {
"": "listDocs",
"docs": "listDocs",
"docs/:doc_id" : "readDoc",
"docs/:doc_id/edit" : "editDoc"
},
listDocs: function () {
console.log("listDocs") // Logs to console
// App.DocApp.List.Controller.listDocs();
}
});
Marionette扩展了Backbone的内置路由,所以如果你想让router.navigate
触发路由功能,you'll have to pass the option trigger like this:
router.navigate('docs', {trigger: true});
最终切换到 backbone.base-router,这让我可以指定一个控制器,因为 Marionette AppRouter 显然与 Browserify 有问题。
我正在尝试从 Marionette 1.* > 2.4.2 升级应用程序。此更改的最大部分是从 Marionette 模块转变为使用 Browserify/Watchify CommonJS 样式模块。
我在尝试 Router/Controller 和 运行 时遇到了障碍。没有抛出错误,但由于某些原因,我的路由没有触发我的控制器方法。
doc_router.js:
var $ = require('jquery')
, _ = require("underscore")
, Backbone = require("backbone")
, Marionette = require("backbone.marionette")
, App = require("../../app.js")
var Router = Marionette.AppRouter.extend({
appRoutes: {
"docs": "listDocs"
}
});
// Map to controllers
var API = {
listDocs: function () {
console.log("listDocs") // Doesnt log to console
App.DocApp.List.Controller.listDocs();
}
};
// Update the URL when a controller event
// that requires it is triggered, then call
// appropriate controller via API.
App.on("docs:list", function () {
App.navigate("docs");
API.listDocs();
});
// Initialize router when app starts
App.on("before:start", function () {
console.log("History started? ", Backbone.History.started);
console.log("Initializing router...")
new Router({
controller: API
});
});
module.exports = Router;
app.js:
var $ = require('jquery')
, _ = require("underscore")
, Backbone = require("backbone")
, Marionette = require("backbone.marionette")
var App = new Marionette.Application();
App.addRegions({
mainRegion : "#main-region",
modalRegion : "#modal-region"
});
App.on("start", function () {
if (Backbone.history) {
console.log("Application starting...");
var fetchingCurrentUser = App.request("entities:current-user");
$.when(fetchingCurrentUser).done(function (current_user) {
App.currentUser = current_user;
console.log("Starting history...");
Backbone.history.start();
console.log("History started? ", Backbone.History.started);
});
}
});
module.exports = App
main.js:
var _ = require('underscore');
var App = require('./app.js');
App.Entities = _.extend({},
require("./entities/doc.js"),
require("./entities/user.js")
);
// DocsApp
App.DocsApp = {
"Router": require("./apps/doc/doc_router.js"),
"Reader": {
"Controller": require("./apps/doc/reader/doc-reader_controller.js"),
"Views": require("./apps/doc/reader/doc-reader_views.js")
},
"List": {
"Controller": require("./apps/doc/list/doc-list_controller.js"),
"Views": require("./apps/doc/list/doc-list_views.js")
}
};
App.start();
从我的控制台日志来看,我似乎没有在创建路由器之前启动 Backbone.history。真的把我的头发拉到这个......任何帮助表示赞赏。
编辑
使用 Backbone.Router 似乎有效(如下)。为什么 Marionette.AppRouter 不起作用?
var Router = Backbone.Router.extend({
routes: {
"": "listDocs",
"docs": "listDocs",
"docs/:doc_id" : "readDoc",
"docs/:doc_id/edit" : "editDoc"
},
listDocs: function () {
console.log("listDocs") // Logs to console
// App.DocApp.List.Controller.listDocs();
}
});
Marionette扩展了Backbone的内置路由,所以如果你想让router.navigate
触发路由功能,you'll have to pass the option trigger like this:
router.navigate('docs', {trigger: true});
最终切换到 backbone.base-router,这让我可以指定一个控制器,因为 Marionette AppRouter 显然与 Browserify 有问题。