正确配置主干Marionette中父子关系的路由器

Mar*_*way 1 backbone.js marionette

尝试创建一个允许用户添加编辑和查看父子组合的页面.

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);
        }
    };
Run Code Online (Sandbox Code Playgroud)

拥有"this.ViewClient"感觉hacky并且也无法正常工作.

Der*_*ley 8

多部分答案,这里......

"this.ViewClient不是一个函数"

这是Marionette的一个错误.控制器方法在路由器而不是控制器的上下文中调用,因此调用this.ViewClient试图在路由器上找到它.

哎呀.

错误记录.会尽快解决.https://github.com/derickbailey/backbone.marionette/issues/38

-

更新:此错误现已在Backbone.Marionette的v0.5.1中修复https://github.com/derickbailey/backbone.marionette

-

要解决此问题,您可以这样做:

PolicyEdit: {
  someController.ViewClient();
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可能需要使用Underscore.js bindbindAll方法来确保对控制器功能的正确绑定.

一旦我修复了错误,这些解决方法就没有必要......希望今天晚些时候/今晚.

基本上是调用其他路线操纵多个区域的最佳方式?

对这个问题的直接回答是否定的.

但是,在这种情况下,你不是在呼叫一条路线.你在控制器上调用一个方法.这很好 - 实际上,我会鼓励这一点.它是对象的正确使用,是我认为应该完成的事情之一,而不是调用另一个路由/路由器处理程序.

路由器和控制器

路由器是一项功能,而不是架构要求.您的应用程序应该在没有路由器的情况下工作,并且路由器应该只添加使用书签和浏览器的前进/后退按钮的功能.

考虑到这种理念(我知道这是有争议的),使用像你一样的控制器并在控制器上调用多个方法以使应用程序处于正确的状态,这是正确的方法之一.

这样看:如果你从应用程序中删除路由器,你将被迫直接调用控制器上的方法.为了防止代码重复,您需要在控制器上创建许多可以很好地完成一件事的小方法,然后用这些较小的方法组合更大的方法.

希望有所帮助.:)