Backbone转到同一路由不会刷新页面

时间:2014-09-15 16:35:23

标签: backbone.js marionette

我有一个非常简单的标签,它将转到当前路线,因为我需要刷新页面以清除一些消息。

<span>Click <a href="/#resetPassword">here</a> to go get your password back</span>

&lt; - 我现在在/ resetpassword路线 - &gt;

但这不起作用,因为我认为Backbone路由检测到它是相同的路由,因此只返回。

我发现this question与我有关,但不同之处在于我没有使用函数,只是标记。

(CMD + R)有效

那么有什么方法可以在标签中刷新相同的路由页面吗?

谢谢!

1 个答案:

答案 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收听的自定义事件,然后重新呈现自身。