2015-10-26 20 views
20

ngFor से मूल्यों के विरुद्ध ngModel का उपयोग करना संभव नहीं है (या अभी तक संभव नहीं है)? क्या कोणीय मुझे खराब प्रदर्शन से बचाने की कोशिश कर रहा है?ngFor चर के खिलाफ कोणीय 2 ngModel

बढ़िया काम करता है: http://jsfiddle.net/langdonx/n5pjgev6/

<input type="text" [(ng-model)]="value">{{value}} 

इतना महान काम नहीं करता: http://jsfiddle.net/langdonx/n5pjgev6/1

<li *ng-for="#name of names"> 
    <input type="text" [(ng-model)]="name">{{name}} 
</li> 

अपवाद: बाध्यकारी नाम

मैं के लिए बाध्य की कोशिश की एक चर पुन: असाइन नहीं किया जा सकता सरणी के साथ-साथ, जो ... काम करता है, bu टी फोकस hijacks और यह भी एक अपवाद फेंकता है: http://jsfiddle.net/langdonx/n5pjgev6/2/

<li *ng-for="#name of names; #i = index"> 
    <input type="text" [(ng-model)]="names[i]">{{name}} 
</li> 

अपवाद: LifeCycle.tick रिकर्सिवली कहा जाता है

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

मैं एक का उपयोग कर LifeCycle.tick समस्या के समाधान प्राप्त कर सकते हैं अधिक प्रत्यक्ष दृष्टिकोण, लेकिन फोकस अभी भी चोरी हो गया है क्योंकि ngFor चीजों को दोबारा हटाता है: http://jsfiddle.net/langdonx/n5pjgev6/3/

<li *ng-for="#name of names; #i = index"> 
    <input type="text" [value]="names[i]" (input)="names[i] = $event.target.value">{{names[i]}} 
</li> 
+0

http://teropa.info/blog/2015/06/09/transclusion.html ट्रांसक्लुजन स्कोप जीवनचक्र प्रबंध और बार-बार तत्व ट्रांसक्लुजन साथ प्रतिपादन के बारे में पैराग्राफ पढ़ें। शायद आपको थोड़ी अंतर्दृष्टि मिल सकती है – cjds

+2

देर से बीटा के बाद 'ngMorel 'के साथ' ngfor' के साथ 'trackBy' उपलब्ध है http: // stackoverflow देखें।कॉम/प्रश्न/36469710/कोणीय-2-एनजीएमडेल-बाइंड-इन-नेस्टेड-एनजीएफ –

+1

@ गुंटर ज़ोचबॉयर सुंदर गड़बड़ हो गया है, आप इसे अपने नए उत्तर के लिए डुप्लिकेट के रूप में चिह्नित करेंगे। – Langdon

उत्तर

16

मुझे लगता है कि ngFor उन सरणी तत्वों को ट्रैक करना पसंद नहीं है जो उन पर ngModel वाले आदिम मान हैं।

यदि आप लूप के अंदर ngModel हटाते हैं, तो यह काम करता है।

यह भी काम करता है जब मैं update jsfiddle साथ:

this.names = [{name: 'John'}, {name: 'Joe'}, {name: 'Jeff'}, {name: 'Jorge'}]; 

और

<li *ng-for="#n of names"><input type="text" [(ng-model)]="n.name">{{n.name}}</li> 
+0

मुझे एक ही समस्या थी और मैंने इसे अपने मूल्य के चारों ओर एक रैपर का उपयोग करके हल किया (ठीक है जो आपने ऊपर किया था)। लेकिन मुझे पूछने दो: क्या यह एक कोणीय 2 बग या "फीचर" है? मुझे पूरा यकीन नहीं है कि यह क्यों हो रहा है। – AstrOne

+2

बिलकुल भी नहीं। स्ट्रिंग प्राइमेटिव हैं इसलिए कोई संदर्भ पता नहीं है और ng2 इसके मूल्य को लूप (ngFor) के अंदर पहचानने के बजाय लेता है। फिर ngModel इस मान को संशोधित करना चाहता है -> अपवाद – bertrandg

+0

कोशिश नहीं की गई लेकिन मुझे लगता है कि यह लगभग ng1 के साथ व्यवहार करता है। – bertrandg

7

एक समाधान अपने सूचकांक द्वारा ngModel अंदर मूल्य संदर्भ के लिए है। इसलिए [(ngModel)]="names[index]"

लेकिन यह पर्याप्त नहीं है क्योंकि *ngFor मूल्य के आधार पर आइटम ट्रैक करता है। जैसे ही मूल्य बदल जाता है, पुराने मूल्य को ट्रैक नहीं किया जा सकता है। तो हमें एक सूचकांक वापस करने के लिए ट्रैकिंग फ़ंक्शन को बदलने की आवश्यकता है, इस प्रकार trackBy: trackByIndex

यह समस्या here समझाया गया है।

समाधान:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <input type="text" 
     *ngFor="let name of names; let nameIndex = index; trackBy: trackByIndex" 
     [(ngModel)]="names[nameIndex]"/> 
     <br/> 
     {{ names | json }} 
    </div> 
    `, 
}) 
export class App { 

    names: string[]; 

    constructor() { 
    this.names = ['a', 'b', 'c']; 
    } 

    public trackByIndex(index: number, item) { 
    return index; 
    } 
} 
संबंधित मुद्दे