Javascript Backbone.js-未触发更改事件 //定义模型。视图是一个带计数器的div。 Tasks=Backbone.Collection.extend({localStorage:newstore(“Tasks”)}) 任务=新任务 Tasks.bind('add',函数(任务模型){ task_model.bind('change',function(){render(this)}) $('.container').append(呈现(任务\模型)) }) 函数渲染(模型){ console.log('rendering,daily_times:',model.get('daily_times')) var div='%time' var time_str=model.get('daily_times')['2011年6月28日'] div=div.replace('%id',model.id.).replace('%time',time\u str) $('div[task_id=“%id”]”。替换('%id',model.id))。替换为(div) 返回分区 } //开始ping 设置间隔(ping,1000) 创建({daily_times:{'Jun 28 2011':0}}) 函数ping(){ console.log('ping') 任务。每个(功能(任务){ var times=task.get('daily_times')) 次数['2011年6月28日]+=1 task.set({daily_times:times}) console.log('incremented,time:',task.get('daily_times')['Jun 28 2011'])) }) }

Javascript Backbone.js-未触发更改事件 //定义模型。视图是一个带计数器的div。 Tasks=Backbone.Collection.extend({localStorage:newstore(“Tasks”)}) 任务=新任务 Tasks.bind('add',函数(任务模型){ task_model.bind('change',function(){render(this)}) $('.container').append(呈现(任务\模型)) }) 函数渲染(模型){ console.log('rendering,daily_times:',model.get('daily_times')) var div='%time' var time_str=model.get('daily_times')['2011年6月28日'] div=div.replace('%id',model.id.).replace('%time',time\u str) $('div[task_id=“%id”]”。替换('%id',model.id))。替换为(div) 返回分区 } //开始ping 设置间隔(ping,1000) 创建({daily_times:{'Jun 28 2011':0}}) 函数ping(){ console.log('ping') 任务。每个(功能(任务){ var times=task.get('daily_times')) 次数['2011年6月28日]+=1 task.set({daily_times:times}) console.log('incremented,time:',task.get('daily_times')['Jun 28 2011'])) }) },javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,当我在ping中设置daily\u times时,为什么不触发更改事件?看起来var times是一个对象而不是一个值。因此,当它使用u.toEqual方法查看新值是否与旧值相同时,它实际上会将对象与自身进行比较并返回true,因此主干决定不需要触发更改事件 您可以使用task.change()显式触发更改事件。看起来var times是一个对象而不是一个值。因此,当它使用u.toEqual方法查看新值是否与旧值相同时,它实际上会将对象与自身进行比较并返回true,因此主干决定不需要触发更改事件

当我在
ping
中设置
daily\u times
时,为什么不触发更改事件?

看起来
var times
是一个对象而不是一个值。因此,当它使用u.toEqual方法查看新值是否与旧值相同时,它实际上会将对象与自身进行比较并返回true,因此主干决定不需要触发更改事件


您可以使用task.change()显式触发更改事件。

看起来
var times
是一个对象而不是一个值。因此,当它使用u.toEqual方法查看新值是否与旧值相同时,它实际上会将对象与自身进行比较并返回true,因此主干决定不需要触发更改事件


您可以使用task.change()显式触发更改事件。

只是一个样式注释,但您应该以不同的方式命名集合扩展任务对象和实际任务集合对象。重复使用这样的变量不利于可读性-我将第一个变量称为
TaskCollection
,第二个变量称为
tasks
。只是一个样式注释,但您应该以不同的方式命名集合扩展任务对象和实际任务集合对象。重复使用这样的变量不利于可读性-我会调用第一个
TaskCollection
,第二个
tasks
。甚至
task.change()不会触发更改事件。使用
task.trigger('change')task.change()不会触发更改事件。使用
task.trigger('change')如果确实要触发更改事件。
<div class='container'></div>

<script>
// Define models.  View is a div with a counter.
Tasks = Backbone.Collection.extend({localStorage: new Store("tasks")})
Tasks = new Tasks
Tasks.bind('add', function (task_model) {
  task_model.bind('change', function(){ render(this) })
  $('.container').append(render(task_model))
})

function render(model) {
  console.log('rendering, daily_times: ', model.get('daily_times'))
  var div = '<div class="current task_time" task_id="%id">%time</div>'
  var time_str = model.get('daily_times')['Jun 28 2011']
  div = div.replace('%id', model.id).replace('%time', time_str)
  $('div[task_id="%id"]'.replace('%id', model.id)).replaceWith(div)
  return div
}

// Start pinging
setInterval(ping, 1000)
Tasks.create({daily_times:{'Jun 28 2011':0}})
function ping() { 
  console.log('ping')
  Tasks.each(function(task) {
    var times = task.get('daily_times')
    times['Jun 28 2011'] += 1
    task.set({daily_times:times})
    console.log('incremented, time: ', task.get('daily_times')['Jun 28 2011'])
  })
}
</script>