尝试创建一个页面,允许用户添加编辑并查看父子组合。
UI有3列 家长:父母名单:孩子:
我想配置控制器,以便用户可以回到原来的位置,但是看不需要它,所以父和子都可以编辑。
//使用骨干牵线木偶越来越近但仍有一些小问题
MyRouter = Backbone.Marionette.AppRouter.extend({
appRoutes: {
'': 'AddClient',
'View/:clientid': 'ViewClient',
'Edit/:clientid': 'EditClient',
'View/:clientid/Add': 'PolicyAdd',
'View/:clientid/View/:policyid': 'PolicyView',
'View/:clientid/Edit/:policyid': 'PolicyEdit'
}
});
someController = {
AddClient: function () {
var someView = new ClientAdd();
MyApp.clientPane.show(someView);
},
ViewClient: function (clientid) {
var someView = new ClientView();
MyApp.clientPane.show(someView);
},
EditClient: function (clientid) {
var someView = new ClientEdit();
MyApp.clientPane.show(someView);
},
PolicyAdd: function (clientid) {
this.ViewClient(clientid);
var someView = new PolicyAdd();
MyApp.policyPane.show(someView);
},
PolicyView: function (clientid, policyid) {
this.ViewClient(clientid);
var someView = new PolicyView();
MyApp.policyPane.show(someView);
},
PolicyEdit: function (clientid, policyid) {
this.ViewClient(clientid);
var someView = new PolicyEdit();
MyApp.policyPane.show(someView);
}
};
拥有“this.ViewClient”感觉很骇人,但也行不通。
答案 0 :(得分:8)
多部分答案,这里......
这是Marionette的一个错误。控制器方法在路由器而不是控制器的上下文中调用,因此对this.ViewClient
的调用试图在路由器上找到它。
糟糕。
错误记录。会尽快解决。 https://github.com/derickbailey/backbone.marionette/issues/38
-
更新:此错误现已在Backbone.Marionette https://github.com/derickbailey/backbone.marionette
的v0.5.1中得到修复-
暂时解决这个问题,你可以这样做:
PolicyEdit: {
someController.ViewClient();
// ...
}
如果这不起作用,您可能需要使用Underscore.js'bind
或bindAll
方法来确保对控制器功能的正确绑定。
一旦我修复了错误,就不需要这些解决方法......希望今天晚些时候/今晚。
这个问题的直接答案是否定的。
但是,在这种情况下,你不是在呼叫路线。你在控制器上调用一个方法。这很好 - 实际上,我会鼓励这一点。它是对象的正确使用,是我认为应该完成的事情之一,而不是调用另一个路由/路由器处理程序。
路由器是一项功能,而不是架构要求。您的应用程序应该在没有路由器的情况下工作,路由器应该只添加使用书签和浏览器的前进/后退按钮的功能。
考虑到这种理念(我知道这是有争议的),使用像你这样的控制器并在控制器上调用多个方法以使应用程序处于正确的状态,这是正确的方法之一。 / p>
以这种方式看待:如果您从应用程序中删除路由器,您将被迫直接调用控制器上的方法。为了防止代码重复,您需要在控制器上创建许多可以很好地完成一件事的小方法,然后用这些较小的方法组合更大的方法。
希望有所帮助。 :)