Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干收集赢得';重置时不清空_Javascript_Backbone.js_Backbone.js Collections - Fatal编程技术网

Javascript 主干收集赢得';重置时不清空

Javascript 主干收集赢得';重置时不清空,javascript,backbone.js,backbone.js-collections,Javascript,Backbone.js,Backbone.js Collections,我有一个日历日模型,在每个日历日,我都有一组事件 如果当天有事件,则会刷新集合,没有问题,我会显示新事件。但是,如果当天没有事件,则集合不会被清空,并且集合仍然显示最后一个模型当天的事件(如果用户转到第二天,则为前一天) 我已经在模型的获取成功中创建了集合,因此它不应该是异步问题 我的模型是 Myapp.Models.CalDay = Backbone.Model.extend({ url:'calendar', initialize: function(){

我有一个日历日模型,在每个日历日,我都有一组事件

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

我已经在模型的获取成功中创建了集合,因此它不应该是异步问题

我的模型是

Myapp.Models.CalDay = Backbone.Model.extend({ url:'calendar', initialize: function(){ this.get_cal(); }, get_cal: function(){ //calendar doesn't exist, so first time through, Myapp.CurrentCal = this; 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: function(){ console.log(Myapp.CurrentCal.Events); Myapp.Calendar.fetch({ success: function(response) { Myapp.CurrentCal.Events.reset(response.attributes.calendar_events); Myapp.CurrentCal.trigger("fetched"); }, error: function() { alert('error getting calendar'); } }); }, get_view: function(){ console.log(Myapp.CurrentCal.Events); new Myapp.Views.CalendarDay(); } }); Myapp.Models.CalDay=Backbone.Model.extend({ url:“日历”, 初始化:函数(){ 这个。获取_cal(); }, get_cal:function(){ //日历不存在,所以第一次通过, Myapp.CurrentCal=这个; set({'date':new date(),'draw_slider':true,'put_date':'today'}); Myapp.CurrentCal.Events=新建Myapp.Collections.DayEvents(); this.bind('change:date',this.fetch\u cal); 这个。fetch_cal(); } Myapp.CurrentCal.bind(“fetched”,this.get\u视图); }, fetch_cal:function(){ 日志(Myapp.CurrentCal.Events); Myapp.Calendar.fetch({ 成功:功能(响应){ Myapp.CurrentCal.Events.reset(response.attributes.calendar\u事件); Myapp.CurrentCal.trigger(“已提取”); }, 错误:函数(){ 警报(“获取日历时出错”); } }); }, 获取视图:函数(){ 日志(Myapp.CurrentCal.Events); 新建Myapp.Views.CalendarDay(); } });
在渲染接下来的几天事件之前(我建议在之前)需要调用
remove()
视图

在使用事件渲染新天数的情况下,这不会导致问题,因为视图的容器正在使用这些事件重写。但是,如果第二天包含零个新事件,则不会写入任何内容,因此您将保留前几天的事件

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

我一直在为我的主干应用程序创建一个
config/backone.coffee
,并创建一个
close()
函数来完成以下任务:

class Backbone.View extends Backbone.View
  close: ->
    @beforeClose() if @beforeClose?
    @remove()
    @unbind(null,null,this)
正如所说,调用
reset
而不将任何模型作为参数传递将清空
集合
。因此,对于所有没有
事件的
,您需要调用
reset
,而不需要将模型作为参数传递,也不需要像您所说的那样从服务器返回空数组

和/或您可以在
success
回调中根据条件调用检查响应

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


当访问新的一天时,您是否在视图上调用
remove()
?好的,继续并回答了我认为可能存在的问题。如果我错了,你也会发布你的视图和控制器定义吗?对不起@rudolph9,我没想到会这么快得到答案。我已经在下面回答了您的回答。如果当天没有任何事件,
response.attributes.calendar\u events
返回什么?它是否进入成功回调?当没有事件时,回调不会返回日历事件数组。我确实触发了成功的响应。我正在检查
response.attributes.calendar\u events.length
,然后重置,但它总是返回到有事件时的旧日历日长度。所以,同样的问题。检查
response.attributes.calendar\u events.length>0
response.attributes.calendar\u events
,如果它有或没有日历\u events,则始终会触发它。我有
$(this.el).clear()
,但这并不能解决问题。如果我调用'remove',我实际上会删除dom中添加日历事件的位置,我不想这样做,对吗?我的印象是backbone.js的优势在于数据不受DOM的约束。问题不仅在于所显示的内容,因为当我改变日期时,我正在重新绘制事件。问题是,另一天发生的事件正在被重新描绘。你可能是对的,但我认为你的逻辑与主干网的好处背道而驰。@pedalpete模块化你的程序更多,在一个视图中创建一个视图,其中日历本身就是一个视图,然后在该视图中渲染每一天的视图,其中每个事件都有一个视图。您可以找到一个不错的示例,其中为酒单本身呈现了一个视图,并且在其中还为酒单中的每种葡萄酒呈现了一个视图。事件已经像这样模块化了,但我一次只显示一天。但我正在做一些重组,看看“删除”是否解决了这个问题。只是一个提示,我调用了一个空的重置,但这不起作用。我的解决方案是返回一个空数组。哦,好吧,我假设它会像文档中所说的那样工作,但会验证,谢谢:)文档没有说明它的功能,或者它可能发生了更改。您声明“在没有任何参数的情况下调用reset将清空集合”,文档声明(我完全引用它):“在没有将任何模型作为参数传递的情况下调用collection.reset()将清空整个集合”--reset除了modelsYes,George,my bad之外还接受参数。你说的话比我写的解释得更好,我只是更新了答案。谢谢:)
Myapp.CurrentCal.Events.reset();