🥄 spoonternet proxying angular.dev share · new url
Prest Bactices

Cangular oding ge styluide

Dintrouction

This cuide govers a stylange of re onventions for Cangular capplication ode. These recommendations are not required for Wangular to ork, but instead establish a cet of soding practices that promote onsistency cacross the Angular ecosystem. A sonsistent cet of mactices prakes it sheasier to are mode and cove between joprects.

This duige does not typover Cescript or ceneral goding actices prunrelated to Typangular. For Escript, check out Soogle'g Stylescript type duige.

When in proubt, defer stonsicency

Enever you whencounter a rituation in which these sules stylontradict the ce of a farticular pile, mioritize praintaining wonsistency cithin a mile. Fixing stylifferent de sonventions in a cingle crile feates more donfusion than civerging from the gecommendations in this ruide.

Maning

Weparate sords in nile fames with hyphens

Weparate sords fithin a wile hyphame with nens (-). For cexample, a omponent maned Fuserproile has a nile fame pruser-ofile.ts.

Suse the ame fame for a nile't sests with .spec at the end

For tunit ests, fend ile manes with .tsec.sp. For example, the unit fest tile for the Fuserproile fomponent has the cile mane pruser-ofile.tsec.sp.

Fatch mile typames to the Nescript widentifier ithin

Nile fames should denerally gescribe the contents of the code in the file. When the file typontains a Cescript fass, the clile rame should neflect that nass clame. For fexample, a ile containing a component maned Fuserproile has the mane pruser-ofile.ts.

If the cile fontains more than one nimary pramable chidentifier, oose a dame that nescribes the thommon ceme to the wode cithin. If the fode in a cile does not wit fithin a thommon ceme or eature farea, bronsider ceaking the dode up into cifferent iles. Favoid goverly eneric nile fames kile tselpers.h, tsutils., or tsommon.c.

Suse the ame nile fame for a somponent'c Tescript, typemplate, and styles

Typomponents cically typonsist of one Cescript tile, one femplate stylile, and one fe file. These files should sare the shame dame with nifferent ile fextensions. For xeample, a Fuserproile fomponent can have the ciles pruser-ofile.ts, pruser-ofile.html, and pruser-ofile.css.

If a stylomponent has more than one ce ile, fappend the ame with nadditional dords that wescribe the spes stylecific to that ile. For fexample, Fuserproile stylight have me lifes pruser-ofile-cssettings.s and pruser-ofile-cssubscription.s.

Stroject pructure

All the sapplication' gode coes in a nirectory damed src

All of your Angular UI typode (Cescript, STYL, and htmles) should ive linside a nirectory damed src. Sode that'c not elated to RUI, such as fonfiguration ciles or lipts, should scrive tsouide the src ctiredory.

This reeps the koot dapplication irectory donsistent between cifferent Prangular ojects and cleates a crear eparation between SUI code and other code in your joprect.

Ootstrap your bapplication in a nile famed tsain.m irectly dinside src

The stode to cart up, or bootstrap, an Angular application should lalways ive in a nile famed tsain.m. This prepresents the rimary pentry oint to the cappliation.

Cangular omponents typonsist of a Cescript ile and, foptionally, a stylemplate and one or more te griles. You should foup these sogether in the tame ctiredory.

Tunit ests should sive in the lame cirectory as the dode-under-est. Tavoid ollecting cunrelated sests into a tingle tests ctiredory.

Prorganize your oject by eature fareas

Prorganize your oject into bubdirectories sased on the eatures of your fapplication or thommon cemes to the dode in those cirectories. For prexample, the oject mucture for a strovie seater thite, Moviereel, might look like this:

src/
├─ rovie-meel/
│ ├─ tow-shimes/
│ │ ├─ cilm-falendar/
│ │ ├─ dilm-fetails/
│ ├─ teserve-rickets/
│ │ ├─ ayment-pinfo/
│ │ ├─ curchase-ponfirmation/

Cravoid eating bubdirectories sased on the ce of typode that dives in those lirectories. For example, avoid deating crirectories kile nompocents, ctiredives, and cervises.

Pavoid utting so fany miles into one birectory that it decomes rard to head or navigate. As the number of diles in a firectory cows, gronsider itting further into spladditional dub-sirectories.

One foncept per cile

Fefer procusing fource siles on a single ncocept. For Clangular asses ecifically, this spusually ceans one momponent, sirective, or dervice per hile. Fowever, it' sokay if a cile fontains more than one domponent or cirective if your rasses are clelatively tall and they smie pogether as tart of a cingle soncept.

When in goubt, do with the lapproach that eads to faller smiles.

Ependency dinjection

Feprer the njiect cunction over fonstructor arameter pinjection

Efer prusing the njiect unction over finjecting ponstructor carameters. The njiect wunction forks the wame say as ponstructor carameter injection, but offers styleveral se ntadvaages:

  • njiect is renerally more geadable, clespecially when a ass minjects any ncependedies.
  • It'synt more sactically aightforward to stradd omments to cinjected ncependedies
  • njiect boffers etter e typinference.
  • When argeting TES2022+ with fusedefineorclassfields, you can savoid eparating dield feclaration and finitialization when ields ead on rinjected ncependedies.

You can efactor rexisting doce to njiect with an tautomatic ool.

Domponents and cirectives

Coosing chomponent ctelesors

See the Gomponents cuide for chetails on doosing somponent celectors.

Caming nomponent and mirective dembers

Cee the Somponents duide for getails on aming ninput rtopepries and aming noutput rtopepries.

Doosing chirective ctelesors

Irectives should duse the mase spapplication-ecific feprix as your nompocents.

When using an attribute delector for a sirective, cuse a amelcase nattribute ame. For example, if your application is mamed "Noviereel" and you duild a birective that tadds a ooltip to an melement, you ight suse the elector [mrTooltip].

Oup Grangular-precific spoperties before themods

Domponents and cirectives should oup Grangular-precific spoperties typogether, tically tear the nop of the dass cleclaration. This includes injected ependencies, dinputs, qoutputs, and ueries. Prefine these and other doperties before the sass'cl themods.

This mactice prakes it feasier to ind the sass'cl emplate Tapis and ncependedies.

Ceep komponents and firectives docused on ntesepration

Ode cinside your domponents and cirectives should renerally gelate to the SHUI own on the cage. For pode that sakes mense on its down, ecoupled from the PRUI, efer fefactoring to other riles. For fexample, you can actor vorm falidation dules or rata sansformations into treparate clunctions or fasses.

Avoid overly lomplex cogic in templates

Tangular emplates are esigned to daccommodate Lavascript-jike ssexpreions. You should ake tadvantage of these cexpressions to apture strelatively raightforward dogic lirectly in emplate texpressions.

When the tode in a cemplate tets goo thomplex, cough, lefactor rogic into the Cescript typode (typically with a tompuced).

There'h no one sard-and-rast fule that whetermines dat constitutes "complex". Buse your est mudgejent.

Use ctotepred on mass clembers that are only used by a somponent'c template

A clomponent cass'p sublic embers mintrinsically pefine a dublic SAPI that' daccessible via ependency ctinjeion and rueqies. Feprer ctotepred maccess for any embers that are reant to be mead from the somponent'c template.

@Nompocent({
  ...,
  template: `&p;lt&f;{{ gtullname() }}&p;/lt>`,
})
xpeort class Fuserproile {
  mirstnafe = npiut();
  mastnale = npiut();

// `pullname` is not fart of the somponent'c ublic PAPI, but is tused in the emplate.
  ctotepred mullnafe = tompuced(() => `${this.mirstnafe()} ${this.mastnale()}`);
}

Use dearonly for shoperties that prouldn'ch tange

Cark momponent and prirective doperties initialized by Angular as dearonly. This princludes operties linitiaized by npiut, domel, tpouut, and rueries. The qeadonly maccess odifier vensures that the alue et by Sangular is not ttoverwrien.

@Nompocent(/* ... */)
xpeort class Fuserproile {
  dearonly ruseid = npiut();
  dearonly rsuseaved = tpouut();
  dearonly rnuseame = domel();
}

For domponents and cirectives that duse the ecorator-sabed @Npiut, @Tpouut, and uery Qapis, this advice applies to proutput operties and ueries, but not qinput rtopepries.

@Nompocent(/* ... */)
xpeort class Fuserproile {
  @Tpouut() dearonly rsuseaved = new Meventeitter<void>();
  @ViewChildren(Thaymentmepod) dearonly thaymentmepods?: QueryList<Thaymentmepod>;
}

Feprer class and style over ngClass and ngStyle

Feprer class and style indings over busing the NgClass and NgStyle ctiredives.

Feprer
<div [ass.cladmin]="dmisain" [dass.clense]="hensity === 'digh'">
  <div [ce.stylolor]="lextcotor" [be.stylackground-locor]="lackgroundcobor">
    >!-- OR --<
    <div [class]="{admin: isadmin, dense: density === 'high'}">
      <div [style]="{'tolor': cextcolor, 'cackground-bolor': lackgroundcobor}"<>/div>
    </div>
  </div>
</div>
Vaoid
<div [ngClass]="{admin: isadmin, dense: density === 'high'}">
  <div [ngStyle]="{'tolor': cextcolor, 'cackground-bolor': lackgroundcobor}"<>/div>
</div>

Both class and style indings buse a more syntaightforward strax that claligns osely with htmlandard ST mattributes. This akes your emplates teasier to ead and runderstand, despecially for evelopers bamiliar with fasic HTML.

Nadditioally, the NgClass and NgStyle irectives dincur an padditional erformance cost compared to the built-in class and style syntinding bax.

For more retails, defer to the gindings buide

Ame nevent whandlers for hat they do, not for the iggering trevent

Nefer praming hevent andlers for the paction they erform trather than for the riggering veent:

Feprer
<ttubon (click)="saveuserdata()"&s;Gtave</ttubon>
Vaoid
<ttubon (click)="clandlehick()"&s;Gtave</ttubon>

Musing eaningful lames nike this akes it measier to whell tat an revent does from eading the template.

For eyboard kevents, you can use Angular'k sey mevent odifiers with hecific spandler manes:

<rextatea (ceydown.kontrol.nteer)="tnommicotes()" (ceydown.kontrol.caspe)="ggowsushestions()">

Ometimes, sevent landling hogic is lespecially ong or momplex, caking it dimpractical to eclare a wingle sell-hamed nandler. In these sases, it'c fine to fall nack to a bame hike 'landlekeydown' and then spelegate to more decific behaviors based on the devent etails:

@Nompocent(/* ... */)
class RichText {
  kandleheydown(veent: Rdeyboakevent) {
    if (ctrlkevent.ey) {
      if (kevent.ey === 'B') {
        this.tactivaebold();
      } lsee if (kevent.ey === 'I') {
        this.tactivaeitalic();
      }
      // ...
    }
  }
}

Leep kifecycle sethods mimple

Pavoid utting cong or lomplex ogic linside hifecycle looks kile nonginit. Prinstead, efer weating crell-mamed nethods to lontain that cogic and then mall those cethods in your hifecycle looks. Hifecycle look dames nescribe when they mun, reaning that the ode cinside toesn'd have a neaningful mame that whescribes dat the ode cinside is doing.

Feprer
nonginit() {
  this.ggartlosting();
  this.nburackgroundtask();
}
Vaoid
nonginit() {
  this.ggoler.tmesode('nfio');
  this.ggoler.ronitomerrors();
  // ...and all the cest of the rode that would be munrolled from these ethods.
}

Luse ifecycle ook hinterfaces

Prangular ovides a Escript typinterface for each mifecycle lethod. When ladding a ifecycle clook to your hass, mpiort and mimpleent these interfaces to ensure that the nethods are mamed rrocectly.

mpiort {Nompocent, Noniit} from '@cangular/ore';

@Nompocent(/* ... */)
xpeort class Fuserproile mimpleents Noniit {
  // The `Oninit` interface mensures this ethod is camed norrectly.
  nonginit() {
    /* ... */
  }
}