Javascript 跨路由持久化模型和视图的设计模式
假设我在Javascript 跨路由持久化模型和视图的设计模式,javascript,backbone.js,backbone-views,backbone-routing,Javascript,Backbone.js,Backbone Views,Backbone Routing,假设我在/search有一个搜索表单,其中QueryView表示搜索表单。当用户提交查询时,我想路由到/results并为结果添加ResultView,保留QueryView,以防用户想要进行新的搜索 然后,如果用户直接导航到/results,我必须在route函数中创建QueryView和ResultsView。问题是,我希望/search和/results路由中的行为相同,但必须记住在这两个位置进行任何更改 另一种方法是在用户提交时触发/results的路由,这将破坏现有的QueryView
/search
有一个搜索表单,其中QueryView
表示搜索表单。当用户提交查询时,我想路由到/results
并为结果添加ResultView
,保留QueryView
,以防用户想要进行新的搜索
然后,如果用户直接导航到/results
,我必须在route函数中创建QueryView
和ResultsView
。问题是,我希望/search
和/results
路由中的行为相同,但必须记住在这两个位置进行任何更改
另一种方法是在用户提交时触发/results
的路由,这将破坏现有的QueryView
并创建新的QueryView
和ResultView
。这是可行的,但在我的例子中,销毁和重新创建QueryView
会引起一些麻烦
是否有标准的设计模式可以跨路由持久化视图,而不需要在两个位置创建视图?您可以将共享行为放入路由器的方法中,然后让两个路由都调用该方法 要缓存
查询视图
,只需将其作为路由器
的属性即可。在/search
和/results
路由中,只需执行以下操作:
this.queryView = this.queryView || new QueryView();
this.queryView.doWhatever();
最后,我写了一篇文章来处理跨路由的持久视图。用法示例:
// On load
var FooView = Backbone.View.extend({ ... });
var BarView = Backbone.View.extend({ ... });
var vm = new ViewManager({selector: ".content");
// On route
var foo = vm.getView(FooView, {}, true);
vm.showViews([foo]);
// On another route
var foo = vm.getView(FooView, {}, true);
var bar = vm.getView(BarView, {}, true);
vm.showViews([foo, bar]);
并没有真正回答我的问题。即使两者调用相同的函数,在一种情况下QueryView已经存在,而在另一种情况下,需要创建QueryView。