5

में संग्रह ईवेंट श्रोता जोड़ें जब भी मैं अपने संग्रह में नया मॉडल जोड़ता हूं, तो मैं अपना दृश्य अपडेट करने का प्रयास कर रहा हूं।संग्रह बैकबोन

PostsApp.Views.Form = Backbone.View.extend({ 
    template: _.template($('#form-template').html()), 
    render: function(){ 
     this.$el.html(this.template(this.model.toJSON())); 
    }, 
    events:{ 
     'click button' : 'save' 
    }, 

    save: function(e){ 
     console.log("is this working"); 
     e.preventDefault(); 
     var newname = this.$('input[name=name-input]').val(); 
     var newadress = this.$('input[name=adress-input]').val(); 
     this.model.save({name: newname, adress : newadress}); 
    } 


}); 

या मैं अभी भी कर collection.add()

अन्य कि देखने के लिए की तुलना में क्या करना है: मेरा पहला सवाल मैं अपने आप जब मैं, उस मॉडल को बचाने की तरह मेरे संग्रह करने के लिए एक मॉडल में शामिल कर सकता है मेरे विचार में नए मॉडल मैं इस तरह एक 'जोड़ें' घटना श्रोता जोड़ने के लिए कोशिश कर रहा हूँ:

PostsApp.Views.Posts = Backbone.View.extend({ 
    initialize: function(){ 
     this.collection.on('add', this.addOne, this); 

    }, 
    render: function(){ 
     this.collection.forEach(this.addOne, this); 
    }, 

    addOne: function(post){ 
     var postView = new PostsApp.Views.Post({model:post}); 
     postView.render(); 
     this.$el.append(postView.el); 
    } 
}); 

यह न केवल काम नहीं करता है, लेकिन जब मैं इनिशियलाइज़ विधि जोड़ने, यह सिर्फ अपने मॉडल में सब कुछ डुप्लिकेट जब पेज पहले लोड किया गया है।

उत्तर

13

नहीं .. जब आप एक model.save करते हैं, यह सिर्फ एक ज़ोंबी मॉडल पैदा करेगा (यदि ऐसा नहीं पहले से ही है, तो एक नया मॉडल सहेजा जाता है संग्रह .i.e का एक हिस्सा) जो किसी भी संग्रह का एक हिस्सा नहीं है।

तो आपके ईवेंट को संग्रह के लिए ट्रिगर नहीं किया जाएगा।

यदि आप चाहते हैं ऐड घटना शुरू किया जा करने के लिए, संग्रह है, जो तब पता चलेगा कि नए मॉडल जोड़ा जाना आवश्यक है जो संग्रह पर की create विधि का उपयोग करें ..

collection.create({model}); 

तो यह होगा आंतरिक रूप से संग्रह करने के लिए मॉडल जोड़ सकते हैं और आग add event

यह भी on

का उपयोग कर एक बेहतर विचार संलग्न घटनाओं के बजाय listenTo उपयोग करने के लिए है
this.listenTo(this.collection, 'add', this.addOne); 

कोड

PostsApp.Views.Form = Backbone.View.extend({ 
    template: _.template($('#form-template').html()), 
    render: function() { 
     this.$el.html(this.template(this.model.toJSON())); 
    }, 
    events: { 
     'click button': 'save' 
    }, 

    save: function (e) { 
     console.log("is this working"); 
     e.preventDefault(); 
     var newname = this.$('input[name=name-input]').val(); 
     var newadress = this.$('input[name=adress-input]').val(); 
     this.collection.create({ 
      name: newname, 
      adress: newadress 
     }); 
    } 
}); 

PostsApp.Views.Posts = Backbone.View.extend({ 
    initialize: function() { 
     this.listenTo(this.collection, 'add', this.addOne); 

    }, 
    render: function() { 
     this.collection.forEach(this.addOne, this); 
    }, 

    addOne: function (post) { 
     var postView = new PostsApp.Views.Post({ 
      model: post, 
      collection : this.collection 
     }); 
     postView.render(); 
     this.$el.append(postView.el); 
    } 
}); 
+0

धन्यवाद जहां होना चाहिए इस collection.create ({मॉडल}); मेरे कोड में हो? –

+0

तो मूल रूप से आप संग्रह में 'सबव्यू' में पास करेंगे और 'सबव्यू' की सहेजी विधि में आपको इसे –

+0

का उपयोग करने की आवश्यकता होगी, मुझे लगता है कि सहेजने की विधि में, इसलिए जब मैं एक नया फॉर्मूवव्यू बनाता हूं तो मुझे पास करना होगा एक मॉडल के बजाय एक संग्रह? –

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