2013-02-14 34 views
8

मैंने हर जगह एक उत्तर के लिए देखा है लेकिन मुझे जो मिला है उससे संतुष्ट नहीं था।बैकबोन में यह.मोडेल अनिर्धारित है, क्यों?

मुद्दा यह है कि, मैं एडी ओस्मानी से बैकबोन में 'टोडो' ऐप बनाने के लिए एक ट्यूटोरियल कर रहा हूं, लेकिन जब मैं कंसोल को देखता हूं, तो मुझे this.model is undefined कहने में त्रुटि मिलती है।

मैंने इस SO उत्तर Backbone model error displayed in console को भी आजमाया, लेकिन मुझे अभी भी वही त्रुटि मिलती है। कृपया मुझे बताएं कि क्या गलत है।

वैसे, this.model या this.collection क्या हैं? मुझे एक विचार है कि वे Backbone.Model और Backbone.Collection देखें लेकिन वे कैसे काम करते हैं? मैं यह पूछ रहा हूं क्योंकि एक और ट्यूटोरियल में this.collection और this.model.models भी अनिर्धारित थे, जब मैंने स्पष्ट रूप से Model और Collection परिभाषित किया है।

कई धन्यवाद

जे एस:

//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 
}); 

उत्तर

10

आप एक Model या Collection का दृष्टांत और इसे अपने दृश्य को पास किए जाने। अन्यथा, जब आपके TodoView पर रेंडर विधि कहा जाता है, this.model शून्य हो जाएगा।

उदाहरण के लिए, इस तरह अपने कोड के अंतिम कुछ लाइनों उलटफेर का प्रयास करें:

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

var todos = new TodoList(); 

var todoview = new TodoView({model: todos}); 
उस बिंदु से

आगे, आप सब को संशोधित कर सकते हैं (जो एक Collection है) और आपके विचार सब 'घटनाओं को सुन सकते हैं और तदनुसार फिर से प्रस्तुत करें।

+1

मैं गलत हो सकता था, लेकिन मुझे लगता है कि आप 'todos' को' संग्रह 'के रूप में देखने के लिए' संग्रह 'और' मॉडल 'के रूप में पारित करना चाहते हैं, ताकि आप इसे' this.collection' –

3

आपने यह नहीं कहा, लेकिन मुझे लगता है कि आप जो त्रुटि प्राप्त कर रहे हैं वह रेंडर() विधि में हो रही है।

आपकी समस्या यह है कि आप एक नए प्रकार के मॉडल (var Todo = Backbone.Model.extend({...) को परिभाषित करते हैं, हालांकि आप इसे कभी भी तुरंत चालू नहीं करते हैं, न ही आप मॉडल को टोडोव्यू कन्स्ट्रक्टर में पास करते हैं।

var todomodel = new Todo(); 

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

अन्य सवाल में जवाब आपके सवाल का जवाब है:

तो कम से कम आपको बस इतना करना आप को देखने के लिए मॉडल गुजर नहीं कर रहे हैं जब आप दृश्य का दृष्टांत।

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

जब आप किसी दृश्य के निर्माता के लिए एक वस्तु गुजरती हैं, यह निश्चित चाबी के लिए लग रहा है और उन्हें देखने के लिए सीधे जुड़ जाता है।

आप देख सकते हैं कि Backbone's source पर और viewOptions पर खोज कर देखें।

इस प्रकार आप this.model और this.collection स्वचालित रूप से दृश्य के this से जुड़े हुए हैं।

+1

'के रूप में संदर्भ में संदर्भित कर सकें। दूसरे प्रश्न में उत्तर आपके प्रश्न का उत्तर है "? तो आप पोस्ट क्यों कर रहे हैं? – vault

+2

अतिरिक्त संदर्भ के लिए: प्रश्न ने 'this.model' और 'this.collection' के बारे में भी पूछा। बस सहायक होने की कोशिश कर रहा है। – satchmorun

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^