【问题标题】:backbone collection won't empty on reset骨干集合不会在重置时为空
【发布时间】:2012-11-05 04:31:16
【问题描述】:

我有一个日历日模型,并且在每个日历日,我都有一系列事件。

如果当天有事件,集合刷新,没问题,我展示新事件。但是,如果当天没有事件,则集合不会被清空,并且集合仍会显示最后一个模型当天的事件(如果用户去第二天,则为前一天)。

我已经在模型的获取成功中创建了集合,所以它不应该是一个异步问题。

我的模特是

Myapp.Models.CalDay = Backbone.Model.extend({ 网址:'日历', 初始化:函数(){ this.get_cal(); }, get_cal:函数(){ //日历不存在,所以第一次通过, Myapp.CurrentCal = 这个; Myapp.cal.set({'date': new Date(),'draw_slider': true,'put_date':'today'}); Myapp.CurrentCal.Events = new Myapp.Collections.DayEvents(); this.bind('change:date',this.fetch_cal); this.fetch_cal(); } Myapp.CurrentCal.bind("fetched",this.get_view); }, fetch_cal:函数(){ console.log(Myapp.CurrentCal.Events); Myapp.Calendar.fetch({ 成功:功能(响应){ Myapp.CurrentCal.Events.reset(response.attributes.calendar_events); Myapp.CurrentCal.trigger("fetched"); }, 错误:函数(){ alert('获取日历出错'); } }); }, 获取视图:函数(){ console.log(Myapp.CurrentCal.Events); 新的 Myapp.Views.CalendarDay(); } });

【问题讨论】:

  • 当访问新的一天时,您是否在视图上调用remove()
  • 好的,继续回答我认为可能存在的问题。如果我错了,你会发布你的 viewcontroller 定义吗?
  • 对不起@rudolph9 我没想到这么快就有答案。我已经在下面回复了您的回答。
  • 如果当天没有事件,response.attributes.calendar_events 会返回什么?它是否进入成功回调?
  • @Cyclone 没有事件时回调不会返回 calendar_events 数组。我确实触发了响应成功。我正在检查response.attributes.calendar_events.length,然后重置,但它总是返回为有事件时的旧日历日的长度。所以,同样的问题。如果 response.attributes.calendar_events.length>0response.attributes.calendar_events 有 calendar_events,则始终会触发检查。

标签: javascript backbone.js backbone.js-collections


【解决方案1】:

正如documentation 所说,在不传递任何模型作为参数的情况下调用reset 将为空collection。因此,对于没有 events 的所有 days,您需要调用 reset,而不将模型作为参数传递,或者如您所说从服务器返回空数组。

并且/或者您可以在success 回调中检查响应并根据条件调用任一

Myapp.CurrentCal.Events.reset(response.attributes.calendar_events);

Myapp.CurrentCal.Events.reset();

【讨论】:

  • 只是一个注释,我正在调用一个空重置,但那不起作用。我的解决方案是返回一个空数组。
  • 哦,好吧,我认为它会像文档中所说的那样工作,不过会验证,谢谢:)
  • 文档确实没有说明你声称它做了什么,或者它可能改变了。您声明“在没有 any 参数的情况下调用 reset 将清空集合”,文档状态(我引用它exactly):“调用 collection.reset() 而不传递 任何作为参数的模型都会清空整个集合” -- reset 接受参数除了模型
  • 是的,乔治,我的错。你说的比我写的更能说明问题,我刚刚更新了答案。谢谢:)
【解决方案2】:

在渲染接下来的几天事件之前(好吧,我建议之前),您需要调用 remove() 您的视图。

这在你渲染一个新的日子 with 事件的情况下,这不会给你带来问题,因为视图的容器被这些事件覆盖了。但是,如果第二天包含 个新事件,则不会写入任何内容,因此您仍然会显示前几天的事件。

考虑为您的视图创建一个关闭方法,并在视图上执行remove() 函数同时清理您与该视图关联的所有绑定。

我一直在为我的主干应用程序创建一个 config/backone.coffee 并创建一个 close() 函数来完成此操作:

class Backbone.View extends Backbone.View
  close: ->
    @beforeClose() if @beforeClose?
    @remove()
    @unbind(null,null,this)

【讨论】:

  • 我有$(this.el).clear(),但这并不能解决问题。如果我调用“删除”,我实际上会删除 dom 中添加日历事件的位置,我不想这样做,对吗?我的印象是,backbone.js 的优势在于数据不受 DOM 约束。问题不仅在于显示的内容,因为我在更改日期时正在重新绘制事件。问题是另一天的事件正在重新绘制。您可能是正确的,但我认为您的逻辑与骨干的利益背道而驰。
  • @pedalpete 模块化您的程序更多,在视图中创建一个视图,其中日历本身就是一个视图,然后在其中渲染是每天的视图,其中包含每个事件的视图.您可以找到一个不错的示例here,其中为它自己的酒单呈现了一个视图,并且在其中还呈现了列表中每种酒的视图。
  • 事件已经这样模块化了,但我一次只展示一天。但我正在做一些重组,看看“删除”是否能解决问题。
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多