突出显示具有骨干路由器回调的所选项目
Highlight selected item with backbone router callbacks
应用程序布局
我有一个应用程序,它有一个侧边栏,其中包含许多项,还有一个显示这些项的maindiv。还有一个简单的Backbone.Router
、ItemsCollection
和Item
模型。我有一个用于侧边栏的SidebarView
和一个用于显示所选项目的ShowView
。
+-------------------------+
| http://app.de/#/show/3 | <-- Current URL
+-------------------------+
| Sidebar | Main |
|---------+---------------|
| Item 1 | |
SidebarView --> |---------| Display |
| Item 2 | Item 3 | <-- MainView handled by
|---------| here | MainRouter
Selected Item --> | Item 3 *| |
+---------+---------------+
启动时,我初始化SidebarView
和MainRouter
。SidebarView
将其render
方法附加到ItemCollection#all
事件。我还将ItemCollection#refresh
事件附加到Backbone.history.start()
,然后获取ItemCollection
。
$(function() {
window.router = new App.MainRouter;
window.sidebar = new App.SidebarView;
ItemCollection.bind("reset", _.once(function(){Backbone.history.start()}));
ItemCollection.fetch();
});
问题
我想突出显示当前选定的项目。这是通过从路由器绑定route.show
事件来实现的:
# I removed all code which is not necessary to understand the binding
class SidebarView extends Backbone.View
el: ".sidebar"
initialize: () ->
window.router.bind 'route:show', @highlight_item
# The route is routed to #/show/:id, so I get the id here
highlight_item: (id) ->
$(".sidebar .collection .item").removeClass("selected")
$("#item-" + id).addClass("selected")
当我在加载应用程序时选择一个项目时,它非常有效。但是,当页面加载#/show/123
作为URL时,项目不会高亮显示。我运行调试器,发现当调用highlight_item
回调时,侧边栏还没有呈现。
可能的解决方案
是否有任何方法可以重新排序绑定,以便Item#refresh
事件首先调用SidebarView#render
,然后启动路由?
也许是一种变通方法,只从window.router
中获取当前路线(我在骨干文档中没有找到任何方法),并在项目渲染时突出显示它?
或者我的初始化只是愚蠢的,我应该以不同的方式处理事情吗?
您可以做两件事:
- CCD_ 20可以跟踪哪个项目应该被突出显示
- 更新
render
以初始化高亮显示的项目
类似这样的东西:
initialize: () ->
@highlighted_id = null
window.router.bind 'route:show', @highlight_item
render: () ->
# Set everything up inside @el as usual
@highlight_current()
@
highlight_item: (id) =>
@highlighted_id = id
@highlight_current()
highlight_current: () ->
return unless(@highlighted_id)
$(@el)
.find('.selected').removeClass('selected')
.end()
.find("#item-#{@highlighted_id}").addClass('selected')
因此,只要highlight_item
被调用,highlight_current
也将被调用,并设置适当的@highlighted_id
,一切都会正常进行。
相关文章:
- 在我的选项卡jquery ui创建后回调
- 带有选项的 Angular 指令,像 jQuery Widgets 这样的回调
- 在 ng 选项之后完成控制器内部的回调函数
- 挖空下拉选项呈现回调
- 在呈现项目后,挖空选择绑定回调的选项
- 为什么当我将数据选项添加到骨干模型获取时,它不会触发回调
- Jquery Ajax 没有拾取选项参数中指定的函数回调
- jQuery插件:回调选项必须返回false(不起作用)
- 如何在不传递回调函数的情况下将嵌套对象属性作为选项传递
- AJAX请求带有Jquery,不刷新页面,同时使用选项对象和回调
- 如何在Node.js0.11.8及更高版本中使用tlsSocket.regregate(选项、回调)
- 选项中的事件触发器与回调
- 无法在回调时配置选项(jQuery插件)
- jquery插件回调以重置默认选项
- jQuery Widget Factory在回调方法中访问选项
- Jquery回调在bootstrap选项卡中没有触发
- 尝试理解对选择选项进行排序的 .each() 回调
- jQuery - <选项> 标记 - 无法在<选项>“取消选择”或“聚焦”上触发回调
- 如何从AJAX回调中的setTimeout()中调用存储在一组选项中的函数
- 回调选项在Shraepoint 2010 OpenPopUpPageWithTitle