主干提取是添加新行以查看,而不是更新现有行
Backbone fetch is adding new rows to view rather than updating the existing
我仍在学习 Backbone,但我的理解是它应该在这种情况下自动处理更新视图。我的主要索引视图是一个表,其中每一行都是单个模型的视图。
index_view:
Tracker.Views.Friends ||= {}
class Tracker.Views.Friends.IndexView extends Backbone.View
template: JST["backbone/templates/friends/index"]
initialize: () ->
_.bindAll(this, 'addOne', 'addAll', 'render');
@options.friends.bind('reset', this.addAll);
addAll: () ->
@options.friends.each(this.addOne)
addOne: (chaser) ->
view = new Tracker.Views.Friends.FriendView({model : friend})
this.$("tbody").append(view.render().el)
render: ->
$(this.el).html(this.template(friends: this.options.friends.toJSON() ))
@addAll()
return this
型号和系列:
class Tracker.Models.Friend extends Backbone.Model
paramRoot: 'friend'
defaults:
name: null
status: null
class Tracker.Collections.FriendsCollection extends Backbone.Collection
model: Tracker.Models.Friend
url: '/friends.json'
好友观点:
Tracker.Views.Friends ||= {}
class Tracker.Views.Friends.FriendView extends Backbone.View
template: JST["backbone/templates/friends/friend"]
events:
"click .destroy" : "destroy"
tagName: "tr"
destroy: () ->
@options.model.destroy()
this.remove()
return false
render: ->
$(this.el).html(this.template(this.options.model.toJSON() ))
return this
friend.jst.ejs:
<td><a href="javascript:void(0);" data-friendid="<%= id %>" class="friend-link"><%= name %></a></td>
<td><span class="label"><%= status %></span></td>
index.jst.ejs:
<table id="friends_table" class="table table-striped table-bordered">
<tr>
<td>Name</td>
<td>Status</td>
</tr>
</table>
我最初使用 reset 实例化和填充集合,如下所示:
friends = new Tracker.Collections.FriendsCollection()
friends.reset data
然后,我实例化我的索引视图并将其传递给我的集合:
view = new Tracker.Views.Friends.IndexView(friends: friends)
这一切都工作正常,并且显示一个表格,其中包含来自 Web 服务器的行。 但是,我想定期更新服务器上发生的更改的朋友列表,所以我使用 collection.fetch 方法如下(其中 updateStatus 与到目前为止描述的代码完全无关(:
window.setInterval (->
friends.fetch success: updateStatus
), 10000
数据从 fetch 返回并正确解析,但它将行附加到我的表中,而不是更新现有行。 我怎样才能使这项工作按照我想要的方式工作?
重置
表时,您实际上永远不会清除表。
更新addAll
函数以清除表。像这样:
class Tracker.Views.Friends.IndexView extends Backbone.View
template: JST["backbone/templates/friends/index"]
# ...
addAll: () ->
@$("tbody").empty()
@options.friends.each(this.addOne)
# ...
请注意,清除这种方式可能会有点泄漏,具体取决于您的代码/交互的复杂程度。 添加每个子视图时,您可能需要保存对它们的引用,然后在清除时循环访问每个子视图并调用自定义删除代码(如果有的话(。
您可能还需要将表头包装在 index.jst.ejs 文件中,这样它就不会与表正文的其余部分一起清除:
<table id="friends_table" class="table table-striped table-bordered">
<thead>
<tr>
<td>Name</td>
<td>Status</td>
</tr>
</thead>
</table>
相关文章:
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- AngularJS:ng之后,重复$scope值未按预期更新
- 如何通过数组更新角度子范围
- Ajax聊天消息重复而不仅仅是更新
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- $rootScope未使用forEach进行更新
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- 在数据提取完成之前进行页面渲染
- Angular:更新一次性绑定的数据
- 主干.js更改模型的 url 参数,提取不会更新获取的数据
- 主干视图在辅助提取时未更新
- 主干提取是添加新行以查看,而不是更新现有行
- 如何从使用ajax更新的json文件中提取值,并将其用作php变量
- 如何从MongoDB中提取项目,并在输入新项目时进行更新
- 为什么不't Settimeout提取更新的图像URL
- 美元.getJSON没有提取更新的信息
- 异步数据提取后更新jquery.sparkline