Коллекция backbone.js не отвечает на .each - PullRequest
4 голосов
/ 15 января 2012

У меня есть то, что должно быть очень просто.Я создаю новую коллекцию и хочу передать ее рендеру и добавить модели коллекции на страницу.

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],...

Ответы [ 3 ]

6 голосов
/ 15 января 2012

вы теряете контекст выполнения, когда вызывается функция обратного вызова для каждого метода

используйте _.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)
},

Хотя из того, что я вижу - я предполагаю, что код, который вы здесь показали, является либо моделью, либо коллекцией - обрабатывает рендеринг вида - вы не должны этого делать! Модели и коллекции предназначены только для хранения и анализа данных - весь рендеринг и управление потоком приложений должны выполняться в представлении (контроллерах) с помощью маршрутизатора.

3 голосов
/ 15 января 2012

$.getJson изменяет ссылку this. Многие методы в jquery делают это, поэтому значение this.render_match равно нулю. Вы передаете нуль 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)
},
0 голосов
/ 15 января 2012

Просто сделаю удар здесь (я ничего не знаю о Backbone.js), но разве это не то, что вы ищете:

$.each(this.search_results, function(index, value) { 
  alert(index + ': ' + value); 
});

Удачи!

...