2012-04-30 10 views
18

मैं नेस्टेड विचारों को परिभाषित कर रहा हूँ, इसलिए जैसे कहो (code example on JSFiddle):Ember.js: कैसे नेस्टेड दृश्य उदाहरणों का उपयोग करने की

App.ParentView = Ember.View.extend({ 
    ChildView: Ember.View.extend({ ... }), 
    method: function() { 
     this.get('ChildView') // => this is the class, not the instance :(
    } 
});​ 

{{#view App.ParentView}} 
    {{#view ChildView}} 
     ... 
    {{/view}} 
{{/view}} 

मैं चाहता माता पिता को देखने और के बीच विशेषताओं का एक बहुत बंधन से बचने के लिए बच्चे का विचार इसके बजाय, मैं this.getPath('ChildView.foo') जैसे कुछ करना चाहता हूं। लेकिन this.get('ChildView') वर्ग है कि मैं Ember.View.extend, नहीं उदाहरण के साथ बनाया देता है, तो मैं गुण उपयोग नहीं कर सकते।

वहाँ माता पिता को देखने के एक विधि के अंदर से एक बच्चे को देखने के वर्तमान उदाहरण पहुँचने के लिए एक विहित रास्ता नहीं है?

उत्तर

24

किसी दृश्य को viewName चर गुजरती हैं और माता-पिता इस तरह के माध्यम से दृश्य पहुँच सकते हैं।

http://jsfiddle.net/Tx3NP/5/

{{#view App.ParentView}} 
    {{#view childView viewName="childViewInstance"}} 
    ... 
    {{/view}} 
{{/view}} 
console.log(this.get('childViewInstance.value')); 

देखें या के रूप में @weltraumpirat अनुशंसा करते हैं और this.get('childViews') सरणी पहुँच सकते हैं।

+0

मुझे लगता है 'viewName' बंधन क्या आप का उपयोग करने के लिए,' _childViews' IMO निजी लग रहा है ember.js लेखकों का इरादा है। और यदि आपके पास कई उदाहरण हैं तो दृश्य को एक आईडी देने में सहायता नहीं होती है। –

+2

धन्यवाद, यह बहुत उपयोगी है। मैंने अपने वर्ग 'चाइल्ड व्यू' (पूंजीकृत) को कॉल करने और इंस्टेंस नामों के लिए 'viewName =" childView "' (गैर-पूंजीकृत) का उपयोग करने का एक सम्मेलन अपनाया है। यह उचित रूप से गैर भ्रमित करता है। –

+0

@Bradley, अपने उदाहरण में, वहाँ '' 'getPath''' और' '' get''' के बीच एक अंतर है, अगर '' 'this''' जनक दृश्य को संदर्भित करता है? –

2

आप _childViews सरणी का उपयोग कर सकते हैं:

console.log(this._childViews[0].get('value')); 

या आप अपना दृश्य एक आईडी दे सकते हैं और केवल संगत HTML तत्व का उपयोग करने के jQuery का उपयोग करें।

{{#view childView id="childView"}} 

console.log(Em.$('#childView')[0].value); 
+0

मैं नैतिक रूप से अपने दूसरे उदाहरण की तरह डोम से बाहर आवेदन डेटा खींच का विरोध कर रहा हूँ। ;-) लेकिन '_childViews' के साथ अच्छा पॉइंटर, भले ही यह निजी हो। –

+0

क्या _childViews के बराबर है जो केवल गैर-आभासी दृश्य देता है? – user1158559

0

यह वास्तव में काफी आसान है।

2.10.0 के रूप में, यदि आप एक घटक के अंदर कर रहे हैं और एक नेस्टेड घटक खोजने की जरूरत है, बस माध्यम से खोज:

const id = 'my-specific-id-im-looking-for', 
    views = this.get('childViews'); 

    let count = views.length; 

    if (count) { 
    while (--count) { 
     if (views[count].get('elementId') === id) { 
     // this is your view. do stuff with it, call methods on it, whatevs; 
     break; 
     } 
    }  
    } 

आप इस से पहले कर रहे हैं, घटक की विधि forEachChildView का उपयोग करके देखें

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