2012-03-09 13 views
15

के साथ एक मॉडल पर एक गतिशील संपत्ति कैसे सेट करें कहानी: मेरे पास बहुत सारी संपत्तियां सेट की जानी चाहिए। चूंकि उनके पास समानताएं हैं, इसलिए मैं कक्षा को पढ़ना चुनता हूं, इनपुटबॉक्स संपत्ति नाम के रूप में हिस्सा है।बैकबोन.जेएस

समस्या: किसी ऑब्जेक्ट की गतिशील प्रॉपर्टी को एक एसोसिएटिव सरणी की तरह सेट किया जा सकता है। तो मैं

var customattribute = this.$el.parents('div').attr('id'); 
var value = $(e.currentTarget()).val(); 

this.model.attributes[customattribute] = value; 

लेकिन यह मॉडल की एक परिवर्तन घटना को ट्रिगर नहीं करेगा। मैं मैन्युअल रूप से एक परिवर्तन ईवेंट ट्रिगर कर सकता हूं, लेकिन यह इस अद्यतन को अपडेट नहीं करेगा। Model.changedAttributes(), मुझे केवल परिवर्तित विशेषता सेट करने की आवश्यकता है, प्रत्येक विशेषता नहीं।

निश्चित रूप से यह काम नहीं करता है या तो:

this.model.set(customattribute: value); 

तो मैं कैसे इस समस्या को संभाल होगा?

मेरे पास ALOT (200+) विशेषताएँ सेट की जा सकती हैं, मैं प्रत्येक विशेषता के लिए अलग ईवेंटलिस्टर्स नहीं बनाना चाहूंगा जब तक कि यह एकमात्र तरीका न हो।

कोड:

var Display = Backbone.View.extend({ 
    className: 'display', 
    events: { 
     'slide .slider' : 'sliderHandler' 
    }, 
    initialize: function(){ 
     _.bindAll(this, 'render', 'sliderHandler','update'); 
     this.model.on('change',this.update, this); 
    }, 
    render: function(){ 
     this.$el.html(_.template(html, {})); 
     this.$('.slider').slider(); 

     return this; 
    }, 
    sliderHandler: function(e){ 
     var slider = $(e.currentTarget); 
     var property = slider.parents('div').attr('id'); 
     var value = slider.slider('value'); 

     this.model.attributes[property] = value;    
    }, 
    update: function(){ 
     console.log(this.model.changedAttributes()); 
     //get changed attribute + value here 

    }, 
}); 

संपादित करें:

दो जवाब नीचे इसे हल। किसी ऑब्जेक्ट पर गुणों को मानचित्र करें और उसे बैकबोन दें। इसके अलावा मुझे एक और समाधान मिला। किसी ऑब्जेक्ट के बजाय, model.set() भी एक सरणी स्वीकार करता है।

model.set(customattribute, value, customattribute2, value2); 
+0

के बराबर है आप रीढ़ मॉडल के लिए HTML तत्वों से मूल्यों का प्रचार करने के लिए जब वे बदल कोशिश कर रहे हैं? –

+0

एक उपयोगकर्ता एक इनपुट बॉक्स भर जाएगा या एक स्लाइडर का उपयोग करेगा। जब किसी भी बदलाव का मूल्य, मुझे पहचानने की आवश्यकता होगी कि वह कौन से 200 इनपुट को डीओएम आईडी पढ़कर बदल गया है। इनपुटबॉक्स/स्लाइडर और डीओएम आईडी $ (e.currentTarget) के मूल्य का उपयोग करना। पेरेंट्स ('div')। Attr ('id'), मैं मॉडल अपडेट करता हूं, जो इस मॉडल के परिवर्तन ईवेंट को सुनने वाले अन्य विचारों को अपडेट करेगा । – Jareish

उत्तर

25

मुझे यकीन है कि मैं पूरी तरह से आपकी समस्या समझ में नहीं हूँ, लेकिन: आप एक विशेषता को अपडेट करना चाहते हैं, तो बस:

this.model.set({ 
    customattribute: value 
}); 

यदि आप चाहते हैं कि सेटिंग घटना ट्रिगर नहीं, आप इस तरह से एक मूक विकल्प दे सकते हैं:

this.model.set({ 
    customattribute: value 
}, {silent:true}); 

मुझे आशा है कि यह आप में मदद करता है।

UPDATED:

एक और तरीका है:

var map = {}; 
map[customattribute] = value; 
this.model.set(map); 
+0

विशेषता को कस्टमटैब्यूट कहा जाएगा। उदाहरण के लिए var customattribute = "test"; this.model.set ({customattribute: 12}); यदि आप मान प्राप्त करने का प्रयास करते हैं: this.model.get ("customattribute"); आपको 12, मिलेगा यदि आप इस.model.get ("test") को आजमाएं; आपको एक अपरिवर्तित सरणी का उपयोग करके 12 – Jareish

+0

को अपरिभाषित नहीं किया जाएगा, आप जो भी चाहते हैं वह कर सकते हैं। मैंने आपको एक उदाहरण देने के लिए अद्यतन किया। दोबारा, यदि आप किसी ईवेंट को आग नहीं करना चाहते हैं, तो विकल्प पास करें: चुप: सच। – Aito

5

आप इस

var attributeName = this.$el.parents('div').attr('id'); 
var value = $(e.currentTarget()).val(); 
var attribute = {}; 
attribute[attributeName] = value; 
this.model.set(attribute); 

करने के लिए करता है, तो विशेषता थी "परीक्षण" और मान 'मान' यह ही होगा की जरूरत है

this.model.set({test: 'value'}); 

जो सही ढंग से विशेषता सेट है और परिवर्तन घटना मॉडल करने के लिए

0

Backbone 0.9.0 (Jan. 30, 2012) के रूप में आपके विचार के लिए धन्यवाद करने के लिए प्रसारित, model.set (source) एक कुंजी, एक मूल्य, और एक विकल्पों वस्तु स्वीकार करता है।

this.model.set(attributeName, value, { silent: true }); 

var attr = {}; 
attr[attributeName] = value; 
this.model.set(attr, { silent: true }); 
संबंधित मुद्दे