2016-12-08 4 views
0

У меня есть модель Person, и я получаю информацию о лицах внутри представления. Обратный вызов successFetchSuccess выполняется, когда ответ имеет объект. Но когда ответ пуст, обратный вызов не вызывается. Любой Угадай?Backbone Fetch success callback не выполняется, когда ответ выборки является пустым массивом

Models.Basic = Backbone.Model.extend({ 
    parse: function(response) { 
     return response; 
    } 
}); 

Models.PersonModel = Backbone.Model.extend({ 
    url: function() { 
     return '/person/' + this.data.id; 
    } 
}); 

Backbone.View.extend({ 

    template: Templates['template'], 

    initialize: function(options) { 
     this.id = options.id; 
     _.bindAll(this, 'FetchSuccess'); 

     this.personModel = new Models.PersonModel(); 
     this.model = new Models.Basic(); 
     this.fetchData(); 
     return this; 
    }, 

    render: function() { 
     this.$el.append(this.template(this.model.toJSON())); 
    }, 

    fetchData: function() { 
     this.personModel.data = { 
      id: this.id 
     }; 
     this.personModel.fetch({ 
      context: this, 
      success: this.FetchSuccess 
     }); 
    }, 

    FetchSuccess: function() { 
     this.model.set({ 
      name: this.personModel.get('name'); 
     }); 
     this.render(); 
    } 
}); 
+2

'Models.collectionModel' почему вы простирающуюся магистральную модель вместо коллекции – Mahi

+0

эй я обновил код –

ответ

1
this.personModel = new Models.PersonModel(); 

Это Магистральная модель, а не коллекция.

this.personModel.fetch({ 
    reset: true, // this doesn't exist on model 
    success: this.FetchSuccess 
}); 

Вы не можете получить модель без id. Кроме того, модель при извлечении ожидает возврата объекта.

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

this.personModel = new Models.PersonModel({ id: "id_here" }); 
// ... 
this.personModel.fetch({ 
    context: this, 
    success: this.FetchSuccess 
}); 

Вот код с исправлениями

// parse isn't needed if you're not going to parse something 
Models.Basic = Backbone.Model.extend({}); 

Models.PersonModel = Backbone.Model.extend({ 
    urlRoot: 'person/', // this handles putting the id automatically 
}); 

Backbone.View.extend({ 
    template: Templates['template'], 

    initialize: function(options) { 
     this.id = options.id; 

     // pass the id here 
     this.personModel = new Models.PersonModel({ id: this.id }); 

     this.model = new Models.Basic(); 
     this.fetchData(); 

     // makes no sense in the initialize since it's never called 
     // manually and never used to chain calls. 
     // return this; 
    }, 

    render: function() { 
     // render should be idempotent, so emptying before appending 
     // is a good pattern. 
     this.$el.html(this.template(this.model.toJSON())); 

     return this; // this is where chaining could happen 
    }, 

    fetchData: function() { 
     // This makes no sense unless you've stripped the part that uses it. 
     // this.personModel.data... 

     this.personModel.fetch({ 
      context: this, // pass the context, avoid `_.bindAll` 
      success: this.onFetchSuccess, 
      error: this.onFetchError 
     }); 
    }, 

    onFetchSuccess: function() { 
     this.model.set({ 
      name: this.personModel.get('name') 
     }); 
     this.render(); 
    }, 
    onFetchError: function() { this.render(); } 

}); 

Вы могли бы поймать ошибку с error обратного вызова, или просто ничего не делать и делают по умолчанию, и повторно вынести на выборку.

Вы также можете слушать модели событий (внутри initialize):

this.listenTo(this.personModel, { 
    'sync': this.FetchSuccess, 
    'error': this.onFetchError 
}); 
this.personModel.fetch(); 
+0

Это прекрасно работает, когда ответ выборки не пуст. Но когда ответ пуст, обратный вызов не выполнял –

+0

@LokeshCherukuri, если ответ пуст, выборка завершилась неудачей по дизайну, даже если он возвращает 200 OK. –

+0

Можете ли вы рассказать мне, как обращаться с таким случаем –

 Смежные вопросы

  • Нет связанных вопросов^_^