2016-07-24 16 views
10

में उपयोगकर्ता क्रिया पर गतिशील रूप से HTML टेम्पलेट स्विच करें। आप संपादन/रीडोनली मोडस के बीच एक बटन क्लिक पर आसानी से HTML टेम्पलेट्स स्विच कर सकते हैं। एनजी-शामिल निर्देश कुंजी था।Angularjs 1.x के साथ कोणीय 2

$scope.getTemplate = function (contact) { 
    if (contact.id === $scope.model.selected.id) return 'edit'; 
    else return 'display'; 
}; 

जो फिर उन टेम्पलेट्स में से एक के लिए नेतृत्व यूआई में सक्रिय होने के लिए:

<table> 
    <thead> 
     <th>Name</th> 
     <th>Age</th> 
     <th></th> 
    </thead> 
    <tbody> 
     <tr ng-repeat="contact in model.contacts" ng-include="getTemplate(contact)"> 
     </tr> 
    </tbody> 
</table> 

प्राप्त getTemplate समारोह इस कोड निष्पादित

प्रदर्शन

<script type="text/ng-template" id="display"> 
     <td>{{contact.name}}</td> 
     <td>{{contact.age}}</td> 
     <td> 
      <button ng-click="editContact(contact)">Edit</button> 
     </td> 
    </script> 

संपादित करें

<script type="text/ng-template" id="edit"> 
    <td><input type="text" ng-model="model.selected.name" /></td> 
    <td><input type="text" ng-model="model.selected.age" /></td> 
    <td> 
     <button ng-click="saveContact($index)">Save</button> 
     <button ng-click="reset()">Cancel</button> 
    </td> 
</script> 

https://jsfiddle.net/benfosterdev/UWLFJ/

कोणीय 2 आर सी 4 के साथ कोई एन-शामिल वहाँ मौजूद हैं।

मैं कोणीय 2 आरसी 4 के साथ एक ही सुविधा कैसे करूं?

उत्तर

18

मैं लाभ उठाने होता है कि ऐसा करने के लिए ngTemplateOutlet निर्देश: यहाँ दृष्टिकोण का एक सरल डेमो है।

के बाद से 2.0.0-rc.2 (2016/06/15) संदर्भ के संस्करण NgTemplateOutlet

को जोड़ा गया है, ताकि आप के रूप में इस सुविधा का उपयोग करने के लिए कोशिश कर सकते हैं में वर्णित मेरी demo plunker (अद्यतन 4.xx को)

template.html

<table> 
    <thead> 
     <th>Name</th> 
     <th>Age</th> 
     <th></th> 
    </thead> 
    <tbody> 
     <tr *ngFor="let contact of contacts; let i = index"> 
      <ng-template [ngTemplateOutlet]="getTemplate(contact)" 
      [ngOutletContext]="{ $implicit: contact, index: i }"></ng-template> 
     </tr> 
    </tbody> 
</table> 


<ng-template #displayTmpl let-contact> 
    <td>{{contact.name}}</td> 
    <td>{{contact.age}}</td> 
    <td> 
     <button (click)="editContact(contact)">Edit</button> 
    </td> 
</ng-template> 

<ng-template #editTmpl let-i="index"> 
    <td><input type="text" [(ngModel)]="selected.name" /></td> 
    <td><input type="text" [(ngModel)]="selected.age" /></td> 
    <td> 
     <button (click)="saveContact(i)">Save</button> 
     <button (click)="reset()">Cancel</button> 
    </td> 
</ng-template> 

घटक।ts

import { Component, ViewChild, TemplateRef } from '@angular/core'; 

interface Contact { 
    id: number; 
    name: string; 
    age: number 
} 

@Component({ 
    .... 
}) 
export class App { 
    @ViewChild('displayTmpl') displayTmpl: TemplateRef<any>; 
    @ViewChild('editTmpl') editTmpl: TemplateRef<any>; 

    contacts: Array<Contact> = [{ 
      id: 1, 
      name: "Ben", 
      age: 28 
     }, { 
      id: 2, 
      name: "Sally", 
      age: 24 
     }, { 
      id: 3, 
      name: "John", 
      age: 32 
     }, { 
      id: 4, 
      name: "Jane", 
      age: 40 
     }]; 

    selected: Contact; 

    getTemplate(contact) { 
     return this.selected && this.selected.id == contact.id ? 
     this.editTmpl : this.displayTmpl; 
    } 

    editContact(contact) { 
     this.selected = Object.assign({}, contact); 
    } 

    saveContact (idx) { 
     console.log("Saving contact"); 
     this.contacts[idx] = this.selected; 
     this.reset(); 
    } 

    reset() { 
     this.selected = null; 
    } 
} 
+0

बहुत बढ़िया डेमो! और कोड कोणीय 1.X के समान है !!! क्या आप मुझे बता सकते हैं कि यह घोषणा क्या है: @ViewChild ('editTmpl') editTmpl: TemplateRef , मैं कुछ हफ्तों के लिए टाइपस्क्रिप्ट कर रहा हूं और मैंने कभी भी वाक्यविन्यास नहीं देखा है। – Pascal

+0

यह घटक वर्ग https://angular.io/docs/ts/latest/api/core/index/TemplateRef-class.html – yurzui

+0

ठीक है धन्यवाद के अंदर टेम्पलेट तक पहुंच है। मैं आपके समाधान को आरसी 2 से पहले कोणीय 2 के लिए dfsq वर्कअराउंड और कोणीय आरसी 2 + :-) – Pascal

2

आपको इस चीज़ के बारे में सोचने के तरीके को बदलने की जरूरत है। यह सिर्फ एक टेम्पलेट नहीं है, यह एप्लिकेशन घटक पेड़ की एक शाखा है। घटकों के संदर्भ में इसके बारे में सोचें और वे आपके आवेदन में किस उद्देश्य से सेवा करते हैं।

आपके मामले में, यदि आपके पास "संपादन" और "प्रदर्शन" दृश्य हैं, तो यह आपके ऐप को संपादन और डिस्प्ले घटकों के साथ डिज़ाइन करने और उन्हें ngIf या ngSwitch के साथ स्विच करने के लिए समझ में आता है। उन घटकों में से प्रत्येक को एक संपत्ति के रूप में डेटा मॉडल (Input) लेने में सक्षम होना चाहिए और जिस तरह से इसकी आवश्यकता है उसे प्रस्तुत करें।

<tbody> 
    <tr *ngFor="let contact of model.contacts"> 
    <contact-display *ngIf="getView(contact) === 'display'" [contact]="contact"></contact-display> 
    <contact-edit *ngIf="getView(contact) === 'edit'" [contact]="contact"></contact-edit> 
    </tr> 
</tbody> 

यूडीपी:

तो यह कुछ इस तरह हो सकता है।

http://plnkr.co/edit/drzI1uL4kkKvsrm0rgOq?p=info

+0

तो तुम चयनकर्ता संपर्क-प्रदर्शन/संपर्क संपादित और एक निर्देश [संपर्क] के साथ एक घटक बनाने? – Pascal

+0

नहीं, आपको निर्देश की आवश्यकता नहीं है। यह संपत्ति संपर्क (या जो कुछ भी) के साथ सिर्फ एक घटक है। मैं जवाब अपडेट कर दूंगा। – dfsq

+0

मेरे द्वारा बनाए गए डेमो की जांच करें कि मैं इसे कैसे करूं। – dfsq

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