我有一个非常简单的标签,它将转到当前路线,因为我需要刷新页面以清除一些消息。
<span>Click <a href="/#resetPassword">here</a> to go get your password back</span>
&lt; - 我现在在/ resetpassword路线 - &gt;
但这不起作用,因为我认为Backbone路由检测到它是相同的路由,因此只返回。
我发现this question与我有关,但不同之处在于我没有使用函数,只是标记。
(CMD + R)有效
那么有什么方法可以在标签中刷新相同的路由页面吗?
谢谢!
答案 0 :(得分:0)
在视图中我会这样做。
在视图中
events:
"click span": "resetPage"
resetPage: ->
@trigger "reset:page"
然后在控制器中
@listenTo currentView, "reset:page", (args) ->
model = args.model
App.vent.trigger "reset:page", model
然后在你的路由器中你会收听该消息并再次调用你的API路由,基本上刷新页面,但是如果你有需要重新获取的东西,你可以将它与每条消息一起传递并避免使用内存/ navigate({trigger: true})
导致的反应迟钝的感觉:)。
@SampleApp.module "PostsApp", (PostsApp, App, Backbone, Marionette, $, _) ->
class PostsApp.Router extends Marionette.AppRouter
appRoutes:
"" : "list"
":id" : "show"
API =
list: ->
new PostsApp.List.Controller
show: (id, post) ->
new PostsApp.Show.Controller
id: id
post: post
App.vent.on "posts:list:clicked", ->
App.navigate "/"
API.list()
App.vent.on "reset:page", (post) ->
App.navigate "/" + post.id
API.show post.id, post
App.addInitializer ->
new PostsApp.Router
controller: API
为避免重新抓取帖子,您可以在控制器的初始化功能中执行此操作:
@SampleApp.module "PostsApp.Show", (Show, App, Backbone, Marionette, $, _) ->
class Show.Controller extends App.Controllers.Application
initialize: (options) ->
{ post, id } = options
post or= App.request "post:entity", id
App.execute "when:fetched", post, =>
@layout = @getLayoutView()
@listenTo @layout, "show", =>
@panelRegion post
@postRegion post
@bannerRegion post
@show @layout
这将使您的应用程序保持高响应性 - 请注意,这是假设您不需要重置模型/集合。如果您只需要重置模型/集合数据,navigate({trigger: true})
路径可能就行了。除非你想跟踪你添加的项目,并在事件中做一些手动重置,然后重新渲染视图。
我想您也可以在模型中实现"resetModel"
函数,该函数将重新获取它并触发您的视图可以作为modelEvents
收听的自定义事件,然后重新呈现自身。