2015-08-22 4 views
1

Я действительно новичок в позвоночнике и в мире замешательства. Сейчас я пытаюсь сделать вид одного человека, желательно без повторения всей коллекции, используя метод collection.get().Невозможно прочитать свойство «toJSON» неопределенного + позвоночника

Вот коллекция пользователя:

App.Collections.UserCollection = Backbone.Collection.extend({ 
    url: "/users", 
    model: App.Models.User, 

    initialize: function(){ 
     console.log('users collection'); 
    }, 

}); 

Модель пользователя:

App.Models.User = Backbone.Model.extend({ 
     rootURL: '/users', 
     initialize: function(){ 
      console.log('User model being generated'); 
     } 

    }); 

пользователям View (все пользователи):

App.Views.Users = Backbone.View.extend({ 
     el: "body", 
     model: 'user', 

     initialize: function(){ 
      console.log('User view rendering'); 
      this.collection.fetch(); 
      this.listenTo(this.collection, 'reset', this.addAll); 
     }, 
     clearDiv: function(){ 
      var container = $('#render-area'); 
      $('body').removeClass('homepage'); 
      $('#main-nav').fadeIn(100); 
      container.empty(); 
      this.addUser(); 
     }, 
     addUser: function(){ 
      var current_user_model = this.collection.get(currentUser); 
      var user = new App.Views.ViewUser({ model: current_user_model }); 
      $('#render-area').append(user.el); 
     }, 

     events: { 
      'click #view-profile' : 'clearDiv' 
     } 

}); 

и вид viewUser (один пользователь):

App.Views.ViewUser = Backbone.View.extend({ 

     initialize: function(){ 
      console.log("single user view"); 
      this.template = HandlebarsTemplates['user_profile']; 
      this.render(); 
     }, 
     render: function(){ 
      $('#render-area').html(this.template(this.model.toJSON())); 
     }, 
}); 

Я думал, что я забрал одну модель пользователя в Пользователями просмотра и передачи его мнению ViewUser с этими линиями

var current_user_model = this.collection.get(currentUser); 
var user = new App.Views.ViewUser({ model: current_user_model }); 

Но мне кажется, что я не являюсь. Любая помощь и/или объяснение приветствуются, спасибо!

+0

вы проверили, что есть что-нибудь в вашей модели, прежде чем передать его на ваш взгляд? –

+0

Я бы поспорил, что нет, однако я не уверен, как это исправить. – HolyMoly

+0

Проверьте, может быть? –

ответ

1

Я хотел бы сделать что:

App.Views.Users = Backbone.View.extend({ 
     el: "body", 
     model: 'user', 

     initialize: function(){ 
      console.log('User view rendering'); 
      this.listenTo(this.collection, 'reset', this.addAll); 
     }, 
     clearDiv: function(){ 
      var self = this; 
      this.collection.fetch({ 
       success: function() { 
        var container = $('#render-area'); 
        $('body').removeClass('homepage'); 
        $('#main-nav').fadeIn(100); 
        container.empty(); 
        self.addUser(); 
       } 
      }); 
     }, 
     addUser: function(){ 
      var current_user_model = this.collection.get(currentUser); 
      var user = new App.Views.ViewUser({ model: current_user_model }); 
      $('#render-area').append(user.el); 
     }, 

     events: { 
      'click #view-profile' : 'clearDiv' 
     } 

}); 
+0

Спасибо, Франсуа, я попробую – HolyMoly

2

вы проверить this.collection.get это возвращает объект? Возможно, он не может получить currentUser?

перед визуализацией вид вы должны

а) проверить модель представляет действительную модель перед вызовом просмотра и визуализации «не найден» вид или б) в проверке зрения, если модель действует и визуализации "не найден" вид с) или вы можете обрабатывать его в шаблоне руле

Пример А (непроверенный):

var current_user_model = this.collection.get(currentUser); 
if (current_user_model) { 
    var user = new App.Views.ViewUser({ model: current_user_model }); 
} else { 
    new AppViews.ViewUserNotFound(); 
} 

Пример B:

App.Views.ViewUser = Backbone.View.extend({ 

     initialize: function(){ 
      console.log("single user view"); 
      this.template = HandlebarsTemplates['user_profile']; 
      this.templateNotFound = HandlebarsTemplates['user_profile_not_found']; 
      this.render(); 
     }, 
     render: function(){ 
      if(this.model) { 
       $('#render-area').html(this.template(this.model.toJSON())); 
      } else { 
       $('#render-area').html(this.templateNotFound()); 
      } 
     }, 
}); 
var current_user_model = this.collection.get(currentUser); 
var user = new App.Views.ViewUser({ model: current_user_model }); 

Пример C:

App.Views.ViewUser = Backbone.View.extend({ 

     initialize: function(){ 
      console.log("single user view"); 
      this.template = HandlebarsTemplates['user_profile']; 
      this.templateNotFound = HandlebarsTemplates['user_profile_not_found']; 
      this.render(); 
     }, 
     render: function(){ 
      if(!this.model) { 
       this.model = new this.model(); // create model with defaults 
      } 
      $('#render-area').html(this.template(this.model.toJSON())); 
     }, 
}); 
var current_user_model = this.collection.get(currentUser); 
var user = new App.Views.ViewUser({ model: current_user_model }); 

все примеры непроверенных ..

надеюсь, что это помогает немного, лучше Карстен

+0

Огромное спасибо Карстен, я фактически отказался от Backbone для этого конкретного проекта, поскольку я слишком новичок в нем и в крайнем сроке, но я определенно ценю, что вы показываете мне способ тестирования для того, что происходит, и это техника, которую я буду тестировать в будущем :) – HolyMoly

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