我正在阅读David Sulc的A gentle introduction to Maionette
,并且发现了以下内容:
重要的是要注意路由处理代码应该得到 仅当用户通过URL输入应用程序时才触发,而不是每次都通过 网址更改。换句话说,一旦用户进入我们的Marionette应用程序, 即使用户,也不应再次执行路由处理 导航;
触发导航处理程序的问题是什么?
答案 0 :(得分:0)
如果您已经没有使用Marionette应用程序,则没有任何区别。所以说我们首先进入我们的Marionette应用程序,我们希望它最初路由到帖子索引页面。最初我们可以
navigate({trigger: true)
或navigate
(更新网址),然后致电App.vent
以触发通话。 它们都将在我们控制器的API.list函数中解析,并且行为方式完全相同(获取我们的帖子列表然后显示它)。因此,在最初输入您的应用/路由到第一页时调用trigger: true
是完全正常的。我认为大卫只是试图让它成为一种不这样做的做法,以重新强化木偶的酒吧/子信息结构的力量,因为你不需要来传递{ {1}}。
但是,我们现在说我们现在在列表视图中显示帖子列表。我们在最初进入我们的应用程序时已花费时间从服务器获取帖子列表。现在我们点击帖子并想要查看该帖子的节目视图。帖子已经存在于内存中,所以我们可以只使用trigger: true
来使用已经在内存中的帖子来显示它。如果我们改为使用App.vent.trigger "post:clicked", post
路线,我们会在同一页面上结束,但我们必须使用已在内存中的帖子重新获取单个帖子。
因此,主要原因是因为您不需要 - 触发页面会导致重新加载,重新获取等等。这会让您的应用感觉变得缓慢而且有点挫败了响应式网络应用的目的/单页申请。
这里有你的路由器应该是什么样的 - 你总是希望它设置好,以便你可以在应用程序内部通过navigate({trigger: true})
调用导航到页面并且能够处理手动浏览器刷新/直接导航到路径(这是触发器会执行的操作,但这是您在最初获取资源/进入应用程序时所期望的缓慢负载。在您的应用程序中,您希望它是快速响应酒吧/次级基础设施提供的部分。)
App.vent
然后在那里导航,您只需在任意位置拨打@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 "post:clicked", (post) ->
App.navigate "/" + post.id
API.show post.id, post
App.addInitializer ->
new PostsApp.Router
controller: API
(例如点击"查看所有帖子"按钮并将事件冒泡到控制器并激活那个事件)。
App.vent.trigger "posts:list:clicked"
编辑: 在处理show调用的控制器中,以避免重新获取:
@listenTo bannerView, "posts:list:button:clicked", (args) ->
model = args.model
App.vent.trigger "posts:list:clicked"