Backbone.js - 更改事件未触发

Jes*_*dge 1 javascript jquery backbone.js

<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>
Run Code Online (Sandbox Code Playgroud)

为什么当我daily_times进入时改变事件不会触发ping

c3r*_*rin 5

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

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

  • 甚至`task.change();`也不会在Backbone认为没有属性发生变化时触发更改事件.使用`task.trigger('change');`如果你真的想要触发一个改变事件. (3认同)