2011-06-28 67 views
1
<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> 

为什么在我设置daily_timesping时没有更改事件触发?Backbone.js - 更改事件未触发

+2

只是样式注释,但您应该以不同的方式命名您的集合扩展任务对象和您的实际任务集合对象。像这样重用变量对可读性不好 - 我会调用第一个TaskCollection和第二个Task。 –

回答

5

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

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

+3

甚至当Backbone认为没有属性被改变时,即使'task.change();也不会触发改变事件。使用'task.trigger('change');'如果你真的想触发一个改变事件。 –