我有什么应该很简单。我创建了一个新的集合,我想将它传递给渲染并将集合模型添加到页面中。
get_results: function(){ $.getJson(this.url,function(response){ this.search_results = new Kitchon.Collections.searchList(response); console.log(this.search_results); this.search_results.each(this.render_match); } }, render_match: function(model){ console.log(model) },
这会返回错误
Uncaught TypeError: undefined is not a function
我的收藏品有一个普通的结构
_byCid: Object _byId: Object _onModelEvent: function () { [native code] } _removeReference: function () { [native code] } length: 7 models: Array[7] __proto__: o
我尝试过很多东西,但有一件事情可能就是我不得不通过
this.search_results.models.each(this.render_match);
因为那是实际的数组,但如果我这样做,我会得到Uncaught typeError: Object [object Object],[object Object],...
答案 0 :(得分:6)
在调用每个方法的回调函数时会丢失执行上下文
在传递回调时使用_.bind(this.render_match, this)
以确保render_match
具有正确的上下文
并且您收到错误,因为您没有为getJson
方法包装回调函数。你也必须在那里使用下划线bind
方法。
你应该阅读一下javascript this
以及如何驯服它 - 试试这里http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/
正确的代码看起来应该或多或少......
get_results: function(){
$.getJSON(this.url, _.bind(function(response){
this.search_results = new Kitchon.Collections.searchList(response);
console.log(this.search_results);
this.search_results.each(_.bind(this.render_match, this));
}, this));
},
render_match: function(model){
console.log(model)
},
虽然从我所看到的 - 我假设你在这里展示的代码是模型或集合 - 处理渲染视图 - 你不应该这样做!模型和集合只用于存储和解析数据 - 所有渲染和控制应用程序流都应该在路由器的帮助下在View(控制器)中完成。
答案 1 :(得分:3)
$.getJson
更改了this
引用。 jquery中的许多方法都这样做,因此this.render_match
的值为null。您将null传递给each
并且失败。
要解决此问题,请在var _this = this;
之前创建对此的引用(例如$.getJson
)并使用它而不是this
。代码应如下所示:
get_results: function(){
var _this = this;
$.getJson(this.url,function(response){
_this.search_results = new Kitchon.Collections.searchList(response);
console.log(_this.search_results);
_this.search_results.each(_this.render_match);
}
},
render_match: function(model){
console.log(model)
},
答案 2 :(得分:-1)
刚刚在这里采取刺刀(我对Backbone.js一无所知),但这不是你想要的:
$.each(this.search_results, function(index, value) {
alert(index + ': ' + value);
});
祝你好运!