Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跨路由持久化模型和视图的设计模式_Javascript_Backbone.js_Backbone Views_Backbone Routing - Fatal编程技术网

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。