Koja je razlika između tvornice i usluge u AngularJS-u i kada ih treba koristiti?


Odgovor 1:
angular.service ('apiService', apiServiceFunction);
kutni.faktor ('apiFactory', apiFactoryFunction);

Mislim da je to pitanje prisutno od osnivanja tvornice i usluga u tvrtki AngularJS. To je možda najviše postavljeno i raspravljano pitanje. Ukratko, oba su jednokrvna i gotovo ista stvar s upozorenjem:

Tvornica: naziva se tvornička funkcija (konstruktor) koju smo stvorili.

apiFactoryInjected <--- apiFactoryFunction ()

Usluga: uslužna funkcija o kojoj pišemo bit će instancirana (nova)

  apiServiceInjected <---- novi apiFactoryFunction ()

Zbunjenost? Pa pogledajte sljedeći članak: AngularJS servis vs tvornica - sa primjerom


Odgovor 2:

Razlika između tvornice i usluge jednaka je razlici između funkcije i objekta

Tvornički dobavljač

  • Daje nam povratnu vrijednost funkcije tj. Jednostavno stvorite objekt, dodate mu svojstva i vratite isti objekt. Kada tu uslugu proslijedite u kontroler, ta će svojstva na objektu sada biti dostupna u tom regulatoru kroz tvornicu. (Hipotetički scenarij) Mogu se koristiti druge ovisnostiUobičajeno se koristi kada instanca usluge zahtijeva složenu logiku stvaranjaUpotrebljava se za ne konfigurirajuće uslugeAko koristite objekt, mogli biste koristiti tvorničkog davatelja.Syntax: module.factory ('factoryName', funkcija);

Pružatelj usluge

  • Daje nam primjerak funkcije (objekta) - Upravo ste instancirali ključnu riječ "novo" i dodaćete svojstva "ovo", a usluga će vratiti "ovo". Kada prenesete uslugu u svoj kontroler, ta svojstva "Ovo" će sada biti dostupno na tom kontroleru putem vaše usluge. (Hipotetski scenarij) Uslužnom objektu možete dodati svojstva i funkcije pomoću ove ključne riječiDodatci se ubrizgavaju kao argumenti konstruktora Koristi se za jednostavnu logiku stvaranjaAko koristite klasu, mogli biste koristiti davatelja uslugaSyntax: module.service ('serviceName', function );

Zajedničke značajke

  • Singleton i bit će kreiran samo jednomponovno iskorišćena komponenta Koristi se za komunikaciju između kontrolera za dijeljenje podataka. Ne može se ubrizgati u .config () funkciju.

izvor (lijepo objašnjenje) - AngularJS: Tvornica i usluga?

više detalja - Servis vs tvornica - jednom za svagda

nadam se da pomaže !!


Odgovor 3:

Kladim se da ne može biti boljeg objašnjenja od ovoga!

Čekaj, što? Još jedan post / članak koji odgovara na veliko pitanje: Servis protiv tvornice, što trebam koristiti? Da, čini se da to više nije potrebno, jer na internetu postoji mnoštvo resursa koji raspravljaju o toj temi. Ispada da se ovo pitanje i dalje pojavljuje svaki tjedan ili tako nekako na različitim kanalima, pa čak i nakon što pročitate prvih deset odgovora na StackOverflow, još uvijek nije baš jasno. Unatoč tome, čini se da trenutni resursi na webu zapravo ne promoviraju stvarnu najbolju praksu, posebno ako uzmemo u obzir nedavna kretanja na web platformi. ES6 gledam te!

Ovaj članak objašnjava jednom zauvijek razliku između usluga i tvornica i zašto želimo preferirati usluge nad tvornicama.

SADRŽAJ

  • Razlika između usluga i tvornica Koje koristiti? Usluge nam omogućavaju korištenje klasa ES6

Razlika između usluga i tvornica

U redu, pa koja je razlika između usluge i tvornice u AngularJS? Kao što svi znamo, možemo definirati uslugu poput ove:

app.service ("MyService", funkcija () {
  this.sayHello = funkcija () {
    console.log ( 'halo');
  };
});

.service () je metoda na našem modulu koja uzima ime i funkciju koja definira uslugu. Prilično ravno naprijed. Jednom definirani, možemo dati određenu uslugu i koristiti je u drugim komponentama, poput kontrolera, direktiva i filtera, poput ove:

app.controller ("AppController", funkcija (MyService) {
  MyService.sayHello (); // prijavi 'zdravo'
});

Ok, jasno. Sada ista stvar kao i tvornica:

app.factory ('MyService', funkcija () {
  povratak {
    sayHello: function () {
      console.log ( 'halo');
    }
  }
});

Opet, .factory () je metoda na našem modulu, a također ima ime i funkciju, koja definira tvornicu. Mi to možemo ubrizgati i upotrijebiti na isti način kao što smo učinili s uslugom. Koja je razlika ovdje?

Pa, mogli biste vidjeti da, umjesto da radimo s tim u tvornici, vraćamo objekt doslovce. Zašto je to? Ispada da je servis funkcija konstruktora dok tvornica nije. Negdje duboko u ovom kutnom svijetu, nalazi se ovaj kôd koji poziva Object.create () s funkcijom servisnog konstruktora, kada se aktivira. Međutim, tvornička funkcija zapravo je samo funkcija koja se zove, zbog čega moramo eksplicitno vratiti objekt.

Da bi to bilo malo jasnije, možemo jednostavno pogledati kutni izvorni kôd. Evo kako izgleda tvornička () funkcija:

tvornica funkcije (ime, factoryFn, izvršiti) {
  pružatelj povratka (ime, {
    $ get: forsirati! == lažno? ExecuceReturnValue (ime, tvornicaFn): factoryFn
  });
}

Ona uzima ime i tvorničku funkciju koja je proslijeđena, a u osnovi vraća dobavljača s istim imenom, koji ima metodu $ get, što je naša tvornička funkcija. Pa što je s tim pružateljem stvari? Pa, kad god tražite injektor za određenu ovisnost, u osnovi on pita odgovarajućeg davatelja primjerka te usluge pozivanjem metode $ get (). Zato je potreban $ get () prilikom stvaranja davatelja usluga.

Drugim riječima, ako negdje ubrizgamo MyService, ono što se događa iza scene je:

MyServiceProvider $ get (). // vratiti instancu usluge

U redu, tvorničke funkcije jednostavno su pozvane, što je s servisnim kodom? Evo još jednog isječka:

usluga funkcije (ime, konstruktor) {
  return factory (ime, ['$ injector', funkcija ($ injector) {
    return $ injector.instantiate (konstruktor);
  }]);
}

Oh gle, ispada da kad nazovemo uslugu () ona zapravo zove tvornicu (). Ali to samo ne prebacuje tvorničku funkciju usluge tvornice u tvornicu. Prolazi funkciju koja od injektora traži od inženjera da primjeri i primijeni objekt. Drugim riječima: usluga poziva unaprijed definiranu tvornicu koja se završava metodom $ get () na odgovarajućem davatelju usluga. $ injector.instantiate () je metoda koja na kraju poziva Object.create () s funkcijom konstruktora. Zato to koristimo u uslugama.

U redu, pa ispada da, bez obzira na to što koristimo, uslugu () ili tvornicu (), uvijek se zove tvornica koja stvara pružatelja naše usluge. Što nas dovodi do najčešće postavljanog pitanja iz povijesti Angula: Koje trebam koristiti?

Koje koristiti?

Postavljanje tog pitanja na Internetu vodi nas do nekoliko članaka i odgovora StackOverflow. Prvi je ovaj odgovor. Kaže:

"Razlika između usluge i tvornice u osnovi je sljedeća:"

app.service ('myService', funkcija () {

  // usluga je samo konstruktorska funkcija
  // koji će se nazvati s "new"

  this.sayHello = funkcija (ime) {
     vrati "Bok" + ime + "!";
  };
});

app.factory ('myFactory', funkcija () {

  // tvornica vraća objekt
  // možete pokrenuti neki kôd i prije

  povratak {
    sayHello: funkcija (ime) {
      vrati "Bok" + ime + "!";
    }
  }
});

Sada već znamo što se događa iza kulisa, ali ovaj odgovor dodaje još jedan komentar. Kaže da možemo pokrenuti kod prije nego što vratimo objekt. To nam u osnovi dopušta da napravimo neke konfiguracijske stvari ili uvjetno stvorimo objekt ili ne, što izgleda da nije moguće pri izradi usluge izravno, zbog čega većina resursa preporučuje korištenje tvornica preko usluga, ali obrazloženje je neprimjereno.

Što ako vam kažem, možemo isto učiniti i s uslugama?

Da, točno. Usluga je, međutim, funkcija konstruktora, što nas ne sprječava u dodatnom poslu i vraćanju literala predmeta. Zapravo, funkcije konstruktora u JavaScriptu mogu vratiti sve što žele. Dakle, možemo uzeti naš servisni kôd i napisati ga na način koji u osnovi čini potpuno istu stvar kao i naša tvornica:

app.service ("MyService", funkcija () {

  // i ovdje bismo mogli napraviti dodatni posao
  povratak {
    sayHello: function () {
      console.log ( 'halo');
    };
  }
});

Hoppla, pa što sad? Tek smo shvatili da, ovisno o tome kako pišemo svoje usluge, više nema razlike između to dvoje. Veliko pitanje ostaje: Koje trebamo koristiti?

Usluge nam omogućuju upotrebu klasa ES6

Naravno, pisanje usluga na taj način djeluje na neki način kontraproduktivno, jer se naziva konstrukcijskom funkcijom, tako da bi je trebalo koristiti i kao jednu. Ima li onda uopće prednost nad ostalima? Da tamo je. Ispada da je zapravo bolje koristiti usluge kad je to moguće kad je riječ o prelasku na ES6. Razlog je jednostavno taj što je usluga funkcija konstruktora, a tvornica nije. Rad s funkcijama konstruktora u ES5 omogućava nam da lako koristimo ES6 klase prilikom prelaska na ES6.

Na primjer, možemo uzeti naš kod i ponovo ga napisati u ES6:

klasa MyService {
  reci zdravo() {
    console.log ( 'halo');
  }
}

app.service ('MyService', MyService);

Klasa ES6 doista je samo konstrukcijska funkcija u ES5. O tome smo pisali u korištenju ES6 s Angularom danas, ako još niste pročitali članak, preporučujem vam da to provjerite.

U tvornicama to nije moguće jer se oni jednostavno nazivaju funkcijama. Nadam se da je ovaj članak sve pojasnio i ohrabruje ljude da ne koriste tvornice preko usluga, ako ne znaju što koristiti.


Odgovor 4:

Tvornica Vs usluga?

Ok, polazimo od Osnove

Angular ima ugrađene usluge, uključujući "Usluge" i "Tvornice"

U tvornici stvarate objekt, dodajete mu svojstva i vraćate isti objekt.

U servisu, objekt ne kreirate izričito, Angularjs ga zamjenjuje iza scene s novom ključnom riječi, u osnovi on konstruira objekt s konstrukcijskom funkcijom.

Konfuzija - omogućuje pojednostavljenje s ovim primjerom.

app.service ( „myService” serviceFunction)

app.factory ( „myFactory” factoryFunction)

var serviceFunction = funkcija () {

// ovdje ćete dodijeliti vrijednosti ovoj funkciji pomoću ključne riječi "this"

// iza scene, kutni će proglasiti var this = {}

this.name = "abc od usluge",

// vratite ovo

}

var factoryFunction = funkcija () {

var someObject = {}

someObject.name = "abc iz tvornice";

vrati neki nazivObject.name;

}

app.controller ( „myCtrl” funkcija (myService, myFactory) {

console.log ("Podaci iz usluge", moja usluga) // o / p serviceFunction: {"name": "abc from service"}

console.log ("Podaci iz tvornice", myFactory) // o / p "abc iz tvornice"

})

tako da će u osnovi servis implicitno vratiti čitavu instancu funkcije ... ali bez tvornice možete vratiti sve što želite .. tako da imate više kontrole u tvornici u odnosu na servis.

Nadam se da vam ovo daje malu ideju o tome kako se razlikuju usluge i tvornice.

možete zatražiti više objašnjenja ako želite.


Odgovor 5:

Hvala za A2A. Zapravo nema velike razlike. U obje možete učiniti isto. Međutim, preporučio bih vam da se držite usluga. Budući da se JavaScript kreće prema strukturi sličnim klasama, Usluge su najbolja praksa. Na primjer, ako ste imali uslugu i prenijeli funkciju, ta je funkcija zapravo klasa. Dakle, ako ste uklonili Angular iz svog projekta, i dalje biste mogli koristiti sve usluge.


Odgovor 6:

Razlika između usluga i tvornica

U redu, pa koja je razlika između usluge i tvornice u AngularJS? Kao što svi znamo, možemo definirati uslugu poput ove:

app.service ("MyService", funkcija () {
  this.sayHello = funkcija () {
    console.log ( 'halo');
  };
});

.service () je metoda na našem modulu koja uzima ime i funkciju koja definira uslugu. Prilično ravno naprijed. Jednom definirani, možemo dati određenu uslugu i koristiti je u drugim komponentama, poput kontrolera, direktiva i filtera, poput ove:

app.controller ("AppController", funkcija (MyService) {
  MyService.sayHello (); // prijavi 'zdravo'
});

Ok, jasno. Sada ista stvar kao i tvornica:

app.factory ('MyService', funkcija () {
  povratak {
    sayHello: function () {
      console.log ( 'halo');
    }
  }
});

Opet, .factory () je metoda na našem modulu, a također ima ime i funkciju, koja definira tvornicu. Mi to možemo ubrizgati i upotrijebiti na isti način kao što smo učinili s uslugom. Koja je razlika ovdje?

Pa, mogli biste vidjeti da, umjesto da radimo s tim u tvornici, vraćamo objekt doslovce. Zašto je to? Ispada da je servis funkcija konstruktora dok tvornica nije. Negdje duboko u ovom kutnom svijetu, nalazi se ovaj kôd koji poziva Object.create () s funkcijom servisnog konstruktora, kada se aktivira. Međutim, tvornička funkcija zapravo je samo funkcija koja se zove, zbog čega moramo eksplicitno vratiti objekt.

Da bi to bilo malo jasnije, možemo jednostavno pogledati kutni izvorni kôd. Evo kako izgleda tvornička () funkcija:

tvornica funkcije (ime, factoryFn, izvršiti) {
  pružatelj povratka (ime, {
    $ get: forsirati! == lažno? ExecuceReturnValue (ime, tvornicaFn): factoryFn
  });
}

Ona uzima ime i tvorničku funkciju koja je proslijeđena, a u osnovi vraća dobavljača s istim imenom, koji ima metodu $ get, što je naša tvornička funkcija. Pa što je s tim pružateljem stvari? Pa, kad god tražite injektor za određenu ovisnost, u osnovi on pita odgovarajućeg davatelja primjerka te usluge pozivanjem metode $ get (). Zato je potreban $ get () prilikom stvaranja davatelja usluga.

Drugim riječima, ako ubrizgamo MyServices negdje, ono što se događa iza scene je:

MyServiceProvider $ get (). // vratiti instancu usluge

U redu, tvorničke funkcije jednostavno su pozvane, što je s servisnim kodom? Evo još jednog isječka:

usluga funkcije (ime, konstruktor) {
  return factory (ime, ['$ injector', funkcija ($ injector) {
    return $ injector.instantiate (konstruktor);
  }]);
}

Oh gle, ispada da kad nazovemo uslugu () ona zapravo zove tvornicu (). Ali to samo ne prebacuje tvorničku funkciju usluge tvornice u tvornicu. Prolazi funkciju koja od injektora traži od inženjera da primjeri i primijeni objekt. Drugim riječima: usluga poziva unaprijed definiranu tvornicu koja se završava metodom $ get () na odgovarajućem davatelju usluga. $ injector.instantiate () je metoda koja na kraju poziva Object.create () s funkcijom konstruktora. Zato to koristimo u uslugama.


Odgovor 7:

Kutni JS djeluje na razdvajanju problema. Za to se oslanja na uslužnu arhitekturu. U ovom su dijelu ugrađene funkcije kao $ location, $ http itd. Svakoj se funkciji dodjeljuje pojedinačni zadatak. Ovo su ugrađene usluge koje imaju prefiks sa znakom $. Ali ako želimo stvoriti vlastitu uslugu, tada koristimo servisni metod.Tako je metoda usluge API koji se koristi za stvaranje funkcija. Oni se pozivaju u toku izvođenja. S druge strane, tvornička metoda nije druga opcija korištenja usluge Architechture, ona može obavljati posao koji se izvodi servisnom metodom, ali nije poput metode usluge. fcatory metoda stvara objekte za razliku od usluge koja je API za kreiranje metoda. Shvatimo to primjerom.

funkcija getClass ($ http) {
  this.getClass = dohvat funkcije () {
    vratiti $ http.get ('class.htm');
  };
}

kutni
  .module ( 'aplikacija')
  .service ('getClass', getClass);
funkcija getClass ($ http) {
  return {// vraća objekt
    fetch: function () {// fukcija definirana u tom objektu
      vratiti $ http.get ('class.htm');
    }
  };
}
kutni
  .module ( 'aplikacija')
  .factory ('getClass', getClass);

Odgovor 8:

Kutni JS djeluje na razdvajanju problema. Za to se oslanja na uslužnu arhitekturu. U ovom su dijelu ugrađene funkcije kao $ location, $ http itd. Svakoj se funkciji dodjeljuje pojedinačni zadatak. Ovo su ugrađene usluge koje imaju prefiks sa znakom $. Ali ako želimo stvoriti vlastitu uslugu, tada koristimo servisni metod.Tako je metoda usluge API koji se koristi za stvaranje funkcija. Oni se pozivaju u toku izvođenja. S druge strane, tvornička metoda nije druga opcija korištenja usluge Architechture, ona može obavljati posao koji se izvodi servisnom metodom, ali nije poput metode usluge. fcatory metoda stvara objekte za razliku od usluge koja je API za kreiranje metoda. Shvatimo to primjerom.

funkcija getClass ($ http) {
  this.getClass = dohvat funkcije () {
    vratiti $ http.get ('class.htm');
  };
}

kutni
  .module ( 'aplikacija')
  .service ('getClass', getClass);
funkcija getClass ($ http) {
  return {// vraća objekt
    fetch: function () {// fukcija definirana u tom objektu
      vratiti $ http.get ('class.htm');
    }
  };
}
kutni
  .module ( 'aplikacija')
  .factory ('getClass', getClass);

Odgovor 9:

Kutni JS djeluje na razdvajanju problema. Za to se oslanja na uslužnu arhitekturu. U ovom su dijelu ugrađene funkcije kao $ location, $ http itd. Svakoj se funkciji dodjeljuje pojedinačni zadatak. Ovo su ugrađene usluge koje imaju prefiks sa znakom $. Ali ako želimo stvoriti vlastitu uslugu, tada koristimo servisni metod.Tako je metoda usluge API koji se koristi za stvaranje funkcija. Oni se pozivaju u toku izvođenja. S druge strane, tvornička metoda nije druga opcija korištenja usluge Architechture, ona može obavljati posao koji se izvodi servisnom metodom, ali nije poput metode usluge. fcatory metoda stvara objekte za razliku od usluge koja je API za kreiranje metoda. Shvatimo to primjerom.

funkcija getClass ($ http) {
  this.getClass = dohvat funkcije () {
    vratiti $ http.get ('class.htm');
  };
}

kutni
  .module ( 'aplikacija')
  .service ('getClass', getClass);
funkcija getClass ($ http) {
  return {// vraća objekt
    fetch: function () {// fukcija definirana u tom objektu
      vratiti $ http.get ('class.htm');
    }
  };
}
kutni
  .module ( 'aplikacija')
  .factory ('getClass', getClass);

Odgovor 10:

Kutni JS djeluje na razdvajanju problema. Za to se oslanja na uslužnu arhitekturu. U ovom su dijelu ugrađene funkcije kao $ location, $ http itd. Svakoj se funkciji dodjeljuje pojedinačni zadatak. Ovo su ugrađene usluge koje imaju prefiks sa znakom $. Ali ako želimo stvoriti vlastitu uslugu, tada koristimo servisni metod.Tako je metoda usluge API koji se koristi za stvaranje funkcija. Oni se pozivaju u toku izvođenja. S druge strane, tvornička metoda nije druga opcija korištenja usluge Architechture, ona može obavljati posao koji se izvodi servisnom metodom, ali nije poput metode usluge. fcatory metoda stvara objekte za razliku od usluge koja je API za kreiranje metoda. Shvatimo to primjerom.

funkcija getClass ($ http) {
  this.getClass = dohvat funkcije () {
    vratiti $ http.get ('class.htm');
  };
}

kutni
  .module ( 'aplikacija')
  .service ('getClass', getClass);
funkcija getClass ($ http) {
  return {// vraća objekt
    fetch: function () {// fukcija definirana u tom objektu
      vratiti $ http.get ('class.htm');
    }
  };
}
kutni
  .module ( 'aplikacija')
  .factory ('getClass', getClass);