2012-04-02 22 views
7

के रूप में काम करने के लिए एम्बर बाइंडिंग नहीं मिल सकता है, मैं emberjs.com पर documentation का पालन कर रहा हूं, लेकिन काम करने के लिए पहले बाइंडिंग उदाहरण नहीं मिल सकता है।दस्तावेज

मैंने प्रदर्शित करने के लिए jsfiddle बनाया। मैं क्या खो रहा हूँ?

उत्तर

11

एम्बर.जेएस बाइंडिंग, पर्यवेक्षकों आदि को अनुमति देने के लिए रनलूप की अवधारणा का उपयोग करता है।

उदाहरण के साथ समस्या यह है कि एक (बाध्य) संपत्ति सेट करके और तुरंत console.log के माध्यम से मूल्य प्राप्त करने से कोई ईवेंट निकाल दिया जाता है जो RunLoop को ट्रिगर करेगा और इसलिए परिवर्तनों को सिंक्रनाइज़ करेगा। RunLoop के बारे में 2 उत्कृष्ट ब्लॉग पोस्ट हैं: Part 1 और Part 2। हालांकि वे Sproutcore को लक्षित करते हैं, अवधारणा Ember.js के लिए समान है।

अपना उदाहरण काम करने के दो तरीके हैं।

के माध्यम से Ember.run.sync()

डॉक्स राज्य के रूप में

सेना तुल्यकालन, Ember.run.sync()लागू ... सिंक करने के लिए तुरंत आवेदन में सभी बाइंडिंग के लिए मजबूर करने के लिए एक उपयोगी तरीका है। इस पत्ते इस तरह कोड, देख http://jsfiddle.net/pangratz666/cwR3P/

App = Ember.Application.create({}); 
App.wife = Ember.Object.create({ 
    householdIncome: 80000 
}); 

App.husband = Ember.Object.create({ 
    householdIncomeBinding: 'App.wife.householdIncome' 
}); 

// force bindings to sync 
Ember.run.sync(); 

console.log(App.husband.get('householdIncome')); // 80000 

// Someone gets raise. 
App.husband.set('householdIncome', 90000); 

// force bindings to sync 
Ember.run.sync(); 

console.log(App.wife.get('householdIncome')); // 90000​ 

या दूसरा विकल्प है ...

एक दृश्य

एक दृश्य में गुण दिखा में मानों दिखाएँ आपके लिए सभी रनलूप सामग्री को संभालती है, देखें http://jsfiddle.net/pangratz666/Ub97S/

जावा स्क्रिप्ट:

App = Ember.Application.create({}); 
App.wife = Ember.Object.create({ 
    householdIncome: 80000 
}); 

App.husband = Ember.Object.create({ 
    householdIncomeBinding: 'App.wife.householdIncome' 
}); 

// invoke function in 3000ms 
Ember.run.later(function() { 
    // someone gets a raise 
    App.husband.set('householdIncome', 90000); 
}, 3000);​ 

Handlebars (देखें):

<script type="text/x-handlebars" > 
    Wifes income: {{App.wife.householdIncome}}<br/> 
    Husbands income: {{App.husband.householdIncome}} 
</script>​ 
दृष्टि से
+0

, हम भी Ember.run.sync() का उपयोग कर सकते हैं, लेकिन केवल एक कॉल तो आवश्यक है। http://jsfiddle.net/akLVy/10/ –

+0

अच्छी तरह से किया गया, क्लेमेंस - बहुत उपयोगी! मुझे लगता है कि हमें दस्तावेज़ों में इसे बेहतर तरीके से समझाने की जरूरत है। यह शुरुआती लोगों के लिए एक अच्छा परिचय नहीं है जब उदाहरणों में से एक "जैसा है" नहीं चलता है। –

+0

धन्यवाद! दान, मैं पूरी तरह से सहमत हूँ। इसे दस्तावेज़ों में अपडेट करने की आवश्यकता है! – pangratz

3

एम्बर के रन लूप को आपके लॉग विवरणों से पहले सिंक करने का मौका देने के लिए आपको अपनी बाइंडिंग सेट करने के बाद Ember.run.sync(); पर कॉल करने की आवश्यकता होगी। एम्बर के साथ परीक्षण के लिए यह एक आसान तकनीक है, लेकिन आम तौर पर एम्बर ऐप्स में इसकी आवश्यकता नहीं होती है।

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