2014-11-06 80 views
0

tl; dr:当从一个页面移动到另一个页面时,仅更改/销毁需要它的块(而不是重新呈现整个页面)。并尽可能简化应用程序路由器。Backbone中的智能渲染子视图

我是新来的骨干,所有的例子开始使用它,我已经看到了关于小应用程序与变化不大,有时(添加/删除一些内容,单页,但从来没有完全重新渲染)。但是,当我开始做我的应用程序,它是一个略微复杂一点,我面对的子视图组织的问题...

问题:当应用程序的每个页面包含的子视图(每个子视图可以有另一个子视图,即嵌套子视图),这是负责在页面中显示他们的块,合理的欲望是不会重新渲染,当你通过网页浏览的是不改变的块。有时你需要重新呈现整个页面,当它从以前的,有时只是一些页面上的块完全不同。但是在这种情况下,应用程序路由器变成了包含太多逻辑的怪物对象,因此很难维护。

我想要什么:我想我的路由器要像

define(['jquery', 'backbone'], function ($, Backbone) { 

    return Backbone.Router.extend({ 

     routes: { 
      "": "home", 
      .......... 
     },  

     home: function() { 
      require(['views/home'], function (View) { 
       var view = new View({ el: $("body") }); 
       view.render(); 
      }); 
     }, 

     .......... 

    }); 
}); 

所以,我的目标是将逻辑渲染子视图的意见。所以,这一观点将决定该怎么做:自我呈现,包括子视图或问子视图来决定同样的问题留给自己。

可能的解决办法:仔细想想我都附带包含的意见,申请状态树(如first_design(家庭(约,登录)))全局对象的想法。当我们移动到下一页时,它具有相同的主视图(即first_design),我们不会呈现first_design视图,但只是它的子视图(在这种情况下只有主页)。对于路由器中的每个页面,我们现在需要手动定义这个视图树。例如像这样:

define(['jquery', 'backbone'], function ($, Backbone) { 

    return Backbone.Router.extend({ 

     routes: { 
      "": "home", 
      "contacts": "contacts", 
      .......... 
     },  

     home: function() { 
      require(['views/firstDesign', 'views/home', 'views/about', 'views/login'], function (FirstDesign, Home, About, Login) { 
       new FirstDesign({ el: $("body"), subviews: { new Home({ subviews: { new About(), new Login() } }) } }); 
      }); 
     }, 

     contacts: function() { 
      require(['views/firstDesign', 'views/contacts'], function (FirstDesign, Contacts) { 
       new FirstDesign({ el: $("body"), subviews: { new Contacts() } }); 
      }); 
     }, 

     .......... 

    }); 
}); 

所以,问题是...:我相信我是重新发明轮子,现在,显然我的车轮是不够好(甚至可能不圆:d)。那么是否有我需要的任何实现?或者,如果不是,那么我该如何正确地做到这一点?谢谢!

P.S:我使用Backbone.js的与require.js。对不起我的英语,这不是我的母语......

回答

0

我意识到,我的解决方案是不那么灵活。毕竟我决定使用木偶。真正帮助我解决我的问题是this question。页。s:Marionette现在在Region类中有一个hasView方法。