2013-02-14 11 views
8

Her yere bir cevap için baktım ama bulduğum şeyden memnun değildim.Omurgada this.model tanımlanmamış, neden?

Sorun şu ki, Addy Osmani'den Backbone'da bir 'Todo' uygulaması yapmak için bir eğitim yapıyorum, ancak konsola baktığımda, this.model is undefined olduğunu belirten bir hata alıyorum.

Bu SO yanıtını Backbone model error displayed in console denedim, ancak yine de aynı hatayı alıyorum. Lütfen bana neyin yanlış olduğunu söyle.

Bu arada, this.model veya this.collection nedir? Backbone.Model ve Backbone.Collection'a başvurdukları konusunda bir fikrim var ama nasıl çalışıyorlar? Ben Model ve Collection ve Model ve Collection açıkça tanımladığınızda, başka bir öğretici this.collection ve this.model.models da tanımlanmamış çünkü bunu soruyorum.

Çok teşekkürler

JS:

//Model 
var Todo = Backbone.Model.extend({ 

    defaults: { 
    title: 'Enter title here', 
    completed: true 
    }, 

    validate: function(attrs) { 
    if (attrs.title === undefined) { 
     return 'Remember to enter a title'; 
    } 
    }, 

    initialize: function() { 
    console.log('This model has been initialized'); 

    this.on('change:title', function() { 
     console.log('-Title values for this model have changed'); 
    }); 

    this.on('invalid', function(model, error) { 
     console.log(error); 
    }); 
    } 
}); 

//View 
var TodoView = Backbone.View.extend({ 

    el: '#todo', 
    tagName: 'li', 
    template: _.template($('#todoTemplate').html()), 

    events: { 
    'dbclick label': 'edit', 
    'click .edit': 'updateOnEnter', 
    'blur .edit': 'close' 
    }, 

    initialize: function() { 
    _.bindAll(this, 'render'); 
      this.render(); 

    }, 

    render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
    this.input = this.$('.edit'); 
    console.log(this.model.toJSON()); 
    return this; 
    }, 

    edit: function() { 
    //do something... 
    }, 

    close: function() { 
    //do something... 
    }, 

    updateOnEnter: function() { 
    //do something... 
    } 
}); 

var todoview = new TodoView(); 
console.log(todoview.el); 

//Collection 
var TodoList = Backbone.Collection.extend({ 
    model: Todo 
}); 

cevap

10

Bir Model veya Collection örneğini ve Görünüm geçmek gerekir. Aksi takdirde, render yöntemi TodoView'unuzda çağrıldığında, this.model boş olacaktır. Eğer (a Collection olan) todos değiştirebilir, ileriye Bu noktadan itibaren

//Collection 
var TodoList = Backbone.Collection.extend({ 
    model: Todo 
}); 

var todos = new TodoList(); 

var todoview = new TodoView({model: todos}); 

ve görünüm Todos' olayları dinleyebilirsiniz:

Örneğin, bu gibi kodunun son birkaç satır yeniden düzenleyerek deneyin ve buna göre yeniden render.

+1

Yanlış olabilirim, ama bence 'todos'u' koleksiyon 'olarak değil' model 'olarak görmek istiyorsunuz, böylece' this.collection' –

3

Bunu söylemediniz, ancak elde ettiğin hatanın render() yönteminde olduğunu farz ediyorum.

Sorununuz, yeni bir model türünü tanımlamanız (var Todo = Backbone.Model.extend({...), ancak bunu hiçbir zaman başlatmamanız veya modeli todoview yapıcısına iletmenizdir.

var todomodel = new Todo(); 

var todoview = new TodoView({ 
    model: todomodel 
}); 
2

diğer söz konusu cevabı sorunun cevabı:

Yani en azından yapmanız gereken görünümü örneğini zaman görünümüne modele geçmek değiliz. Eğer bir görünümün yapıcı bir nesne geçirdiğinizde

var model = new Todo(); 
var todoview = new TodoView({model: model}); 

, belirli anahtarı arar ve bakış bunları doğrudan bağlanır.

Backbone's source'a bakarak ve viewOptions'u arayarak görebilirsiniz.

Yani this.model ve this.collection otomatik bağlanmış olsun nasıl görünümü en this.

+1

olarak görünümün içine bakacaksınız. Diğer sorudaki cevap, sorunuzun cevabıdır "? Peki neden gönderiyorsun? – vault

+2

Ek içerik için: soru ayrıca this.model' ve this.collection' hakkında da sorular sordu. sadece yardımcı olmaya çalışıyorum. – satchmorun