Kokie yra „AngularJS“ prototipo / prototipo paveldėjimo apimties niuansai?

Nuoroda į API nuorodų puslapį :

Regionas gali būti paveldėtas iš tėvų regiono.

Kūrėjo vadovo puslapis :

Objektas (prototipas) paveldi savybes iš patronuojančios srities.

Taigi, ar vaiko objekto paveldima sritis iš jos tėvų yra visada prototipuojama? Ar yra kokių nors išimčių? Ar ji visuomet yra įprastas „JavaScript“ paveldėjimo prototipas?

969
27 дек. nustatė Mark Rajcok 27 d. 2012-12-27 07:48 '12, 7:48, 2012-12-27 07:48
@ 3 atsakymai

Greitas atsakymas :
Vaiko zona paprastai yra prototipiškai paveldima iš patronuojančios zonos, bet ne visada. Vienintelė šios taisyklės išimtis yra direktyva, scope: { ... } - tai sukuria atrankos zoną, kuri nėra prototipiškai paveldėta. Šis statinys dažnai naudojamas kuriant pakartotinai naudojamą komponentų direktyvą.

Kalbant apie niuansus, regiono paveldėjimas paprastai galioja ... tol, kol nereikia susieti dviejų krypčių duomenų (ty formos elementų, ng modelio) vaikų objektų srityje. „Ng-pakartoti“, „ng-switch“ ir „ng-include“ gali išjungti jus, jei bandote susieti su primityviu turiniu (pvz., Skaičiumi, eilute, logotipu) turinio srities tėvų srityje. Tai neveikia, nes daugelis tikisi, kad jis dirbs. Vaiko skydas gauna savo nuosavybę, kuri slepia / užtemdo tame pačiame pavadinime esančią pagrindinę nuosavybę. Jūsų problemos

  • apibrėžti savo modelio tėvų objektus ir tada nukreipti į šio objekto nuosavybę vaiko objekte: parentObj.someProp
  • naudokite $ parent.parentScopeProperty (ne visada įmanoma, bet, jei įmanoma, paprasčiau nei 1.).
  • apibrėžti funkciją tėvų regione ir jį pavadinti iš vaiko (ne visada įmanoma)

Nauji „AngularJS“ kūrėjai dažnai nesupranta, kad ng-repeat , ng-switch , ng-view , ng-include ir ng-if visi sukuria naujas vaikų sritis, todėl problema dažnai kyla, kai įtraukiamos šios direktyvos. (Žr. Šį pavyzdį, kad galėtumėte greitai parodyti problemą.)

Ši primityvioji problema gali būti lengvai išvengiama vadovaujantis „geriausia praktika“, kuri visada turi. “ . savo ng modeliuose - žr. 3 minutes. Misko demonstruoja primityviojo susiejimo su ng-switch problemą.

Simbolio „.“ Buvimas jūsų modeliuose bus užtikrintas prototipo palikimas. Taigi naudokite

 <input type="text" ng-model="someObj.prop1"> <!--rather than <input type="text" ng-model="prop1">` --> 


Ilgas atsakymas :

„JavaScript“ prototipo paveldėjimas

Taip pat paskelbta „AngularJS“ wiki puslapyje: https://github.com/angular/angular.angular.js/wiki/Understanding-Scopes

Svarbu pirmiausia aiškiai suprasti prototipo paveldėjimą, ypač jei atvykstate iš serverio fono ir esate labiau susipažinę su klasės paveldėjimu. Taigi, pirmiausia apsvarstykime tai.

Tarkime, kad „MotherScope“ turi aString, aNumber, anArray, anObject ir aFunction funkcijas. Jei childScope yra prototipiškai paveldėtas iš „MotherScope“, turime:

2019

1699
27 дек. atsakymas, kurį pateikė Mark Rajcok 27 d. 2012-12-27 07:48 '12, 7:48, 2012-12-27 07:48

Nenoriu konkuruoti su Marko atsakymu bet kokiu būdu, bet aš tik norėjau išsirinkti tą dalį, kuri galiausiai padarė viską, kad spustelėtų kaip kažkas naujo „ Javascript“ paveldėjime ir prototipo grandinėje .

Tik nuosavybė nuskaito prototipo grandinės paiešką ir neskaito. Todėl, kai įdiegiate

 myObject.prop = '123'; 

Jis nesiranda grandinės, bet kai diegiate

 myObject.myThing.prop = '123'; 

šiame rašymo operacijoje yra subtilus skaitymas, kuris bando surasti myThing prieš rašydamas į jo palaikymą. Todėl kodėl rašymas į objekto objektus.

136
16 мая '14 в 18:22 2014-05-16 18:22 atsakymą pateikė Scott Driscoll , gegužės 16 d., 14 val., 22:22, 2014-05-16 18:22

Norėčiau pridėti prototipinio paveldėjimo pavyzdį su „JavaScript“ atsakymu į @Scott Driscoll. Naudosime klasikinį paveldėjimo modelį su Object.create (), kuris yra „EcmaScript 5“ specifikacijos dalis.

Pirmiausia sukuriame tėvų objekto funkciją.

 function Parent(){ } 

Tada pridėkite prototipą tėvų objekto funkcijai.

  Parent.prototype = { primitive : 1, object : { one : 1 } } 

Sukurkite vaikų objekto funkciją

 function Child(){ } 

Priskirti vaiko prototipą (prototipo prototipą iš pagrindinio prototipo)

 Child.prototype = Object.create(Parent.prototype); 

Priskirti savo vaiko prototipo konstruktorių

 Child.prototype.constructor = Child; 

Pridėkite „changeProps“ metodą į vaiko prototipą, kuris perrašys „primityvios“ savybės reikšmę Vaiko objekte ir pakeis „object.one“ reikšmę tiek vaiko, tiek tėvų objektuose

 Child.prototype.changeProps = function(){ this.primitive = 2; this.object.one = 2; }; 

Pradėti tėvų (tėtis) ir vaiko (vaiko) objektus.

 var dad = new Parent(); var son = new Child(); 

Skambinimas į „ChildPage“ (sūnaus) metodą changeProps

 son.changeProps(); 

Patikrinkite rezultatus.

Tėvų primityva nuosavybė nepasikeitė

 console.log(dad.primitive);  

Modifikuota (perrašyta) vaikų primityvioji nuosavybė

 console.log(son.primitive);  

Tėvų ir vaiko savybės pasikeičia.

 console.log(dad.object.one);  console.log(son.object.one);  

Darbo pavyzdys yra čia http://jsbin.com/xexurukiso/1/edit/

Skaityti daugiau apie Object.create čia https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create

19
09 нояб. atsakymas suteiktas tylik 09 lapkričio. 2014-11-09 01:45 '14 ne 1:45 am 2014-11-09 01:45