2014-09-03 66 views
0

在一个样品,我有,他们已经模拟一个Ajax调用是这样的:当你将某些东西绑定到超时时,这意味着什么?

route('/page1', 'template1', function() { 
    this.greeting = 'Hello world!'; 
    this.moreText = 'Loading...'; 

    // Simulating an Ajax call which take 0.5 s 
    setTimeout(function() { 
    this.moreText = 'Bacon ipsum...'; 
    }.bind(this), 500); 
}); 

绑定似乎更新“本”,并引发

Object.observe(current.controller, current.render.bind(current)); 

更新一个视图。

我尝试与实际AJAX调用执行相同的事情:

route('/products', 'item_tmpl', function(){ 
    this.products = [] 
    $.getJSON('/data/list.json', function(data){ 
     this.products = data; 
     //var dataObject = { products: data }; 
    }).bind(this); 
}) 

但是,返回undefined不是一个函数。

回答

1

setTimeout存在一个大问题:回调将被调用错误的this。不是来自它被调用的函数的this

从MDN:

当你传递一个方法的setTimeout()(或其它任何功能, 这个问题),它将被用错了这个值调用。

Read more

所以这个代码的作者使用bind()

的bind()方法创建一个新的功能,调用它时,有其 这个关键字设置为所提供的值

该怎么解决这个问题。


$.getJSON('/data/list.json', function(data){ 
     this.products = data; 
     //var dataObject = { products: data }; 
}).bind(this); 

您正在呼吁的$.getJSON回报bind

但是,正如你可以在bind参考文件中看到的那样,它是一个Function方法。 $.getJSON什么也没有返回undefined。这就是原因undefined is not a function.

正确的应该是这样的:

$.getJSON('/data/list.json', function(data){ 
     this.products = data; 
     //var dataObject = { products: data }; 
}.bind(this));