У чым розніца паміж заводам і службай у AngularJS і калі іх трэба выкарыстоўваць?


адказ 1:
angle.service ('apiService', apiServiceFunction); angle.factory ('apiFactory', apiFactoryFunction);

Я думаю, што гэта пытанне ўзнікае з моманту заснавання фабрыкі і сэрвісу ў AngularJS. Гэта, мабыць, самае частае і найбольш спрэчнае пытанне. Карацей кажучы, абодва з'яўляюцца аднатоннымі і амаль аднолькавымі з адным абмежаваннем:

Завод: Фабрычная функцыя (канструктар), якую мы стварылі, называецца.

apiFactoryInjected <--- apiFactoryFunction ()

Паслуга: функцыя абслугоўвання, пра якую мы пішам, маментальная (новая)

apiServiceInjected <---- новая apiFactoryFunction ()

Блытаніна? Глядзіце ў наступным артыкуле: Служба AngularJS супраць завода - з прыкладам


адказ 2:

Розніца паміж завода і сэрвісам такая ж, як і розніца паміж функцыяй і аб'ектам

Заводскі пастаўшчык

  • Вяртае зваротнае значэнне функцыі, г.зн. Вы проста ствараеце аб'ект, дадавайце ўласцівасці, а потым вяртаеце той жа аб'ект. Калі вы перадаеце гэтую паслугу кантролеру, гэтыя ўласцівасці аб'екта будуць даступныя ў гэтым кантролеры праз ваш завод. (Гіпатэтычны сцэнар) Можна выкарыстоўваць іншыя залежнасці. Звычайна выкарыстоўваецца, калі асобнік службы патрабуе складанай логікі зборкі. Выкарыстоўваецца для неконфігуруемых паслуг. Калі вы выкарыстоўваеце аб'ект, вы можаце скарыстацца заводскім пастаўшчыком. Сінтаксіс: module.factory ('factoryName', функцыя);

Пастаўшчык паслуг

  • Дае нам асобнік функцыі (аб'екта) - вы проста стварылі ключавое слова "new" і дадалі ўласцівасці "this", а служба вярнула "this". Пры перадачы паслугі кантролеру, гэтыя ўласцівасці "гэтага" цяпер даступныя на гэтым кантролеры праз вашу паслугу. (Гіпатэтычны сцэнар) Вы можаце дадаць уласцівасці і функцыі ў аб'ект службы, выкарыстоўваючы ключавое слова. Залежнасці ўстаўляюцца ў якасці аргументаў канструктара. Выкарыстоўваецца для простай логікі стварэння. Калі вы выкарыстоўваеце клас, вы можаце скарыстацца функцыяй правайдэраSyntax: module.service ('serviceName',);

Падабенства

  • Сінглтон і ствараецца толькі адзін раз. Шматразовы кампанент, які выкарыстоўваецца для сувязі паміж кантролерамі для абмену дадзенымі. Немагчыма ўставіць у .config () функцыю.

Крыніца (прыемнае тлумачэнне) - AngularJS: фабрыка і сэрвіс?

больш падрабязна - Сервіс супраць завода - раз і назаўжды

Я спадзяюся, што гэта дапаможа !!


адказ 3:

Напэўна, няма лепшага тлумачэння, чым гэта!

Чакаць што? Яшчэ адзін пост / артыкул, які адказвае на вялікае пытанне: Сервіс супраць Фабрыкі, што я павінен выкарыстоўваць? Так, здаецца, што гэта больш не трэба, бо ў Інтэрнэце ёсць шмат рэсурсаў, якія абмяркоўваюць гэтую тэму. Аказваецца, гэтае пытанне ўсё ж узнікае кожны тыдзень ці каля таго па розных каналах. Нават пасля прачытання першых дзесяці адказаў на StackOverflow усё яшчэ не вельмі зразумела. Тым не менш, аказваецца, што цяперашнія рэсурсы ў Інтэрнэце на самай справе не прасоўваюць найлепшыя практычныя практыкі, асабліва калі мы ўлічваем нядаўнія руху ў Інтэрнэце. Я гляджу на цябе!

Гэты артыкул тлумачыць раз і назаўжды розніцу паміж паслугамі і заводамі і чаму мы хочам аддаць перавагу паслугам перад заводамі.

СОДЕРЖАНИЕ

  • Розніца паміж службамі і вытворчасцямі, якія трэба выкарыстоўваць? З паслугамі мы можам выкарыстоўваць класы ES6

Розніца паміж службамі і заводамі

Добра, у чым розніца паміж сэрвісам і заводам у AngularJS? Як мы ўсе ведаем, мы можам вызначыць паслугу, як гэта:

app.service ('MyService', function () {this.sayHello = function () {console.log ('прывітанне');};});

.service () - гэта спосаб нашага модуля, які мае імя і функцыю, якая вызначае службу. Даволі лёгка. Пасля таго, як гэта будзе вызначана, мы можам убудаваць і выкарыстоўваць гэтую канкрэтную службу ў іншых кампанентах, такіх як элементы кіравання, дырэктывы і фільтры:

app.controller ('AppController', функцыя (MyService) {MyService.sayHello (); // часопісы 'Прывітанне'});

Добра, вядома. Цяпер тое самае, што і фабрыка:

app.factory ('MyService', function () {return {sayHello: function () {console.log ('прывітанне');}}});

Зноў жа .factory () - гэта спосаб у нашым модулі, а імя і функцыі выкарыстоўваюцца для вызначэння фабрыкі. Мы можам уводзіць і выкарыстоўваць рэч сапраўды так, як мы гэта зрабілі са службай. Якая тут розніца?

Ну, магчыма, вы ўбачыце, што замест таго, каб працаваць з ім на заводзе, мы вяртаем аб'ект літаральна. Чаму гэта? Аказваецца, служба - гэта канструктар, а фабрыка - не. Дзесьці глыбока ў гэтым вуглавым свеце знаходзіцца гэты код, які выклікае Object.create () з функцыяй канструктара службы, калі ён ствараецца. Аднак фабрычная функцыя - гэта проста функцыя, якая называецца, і таму нам трэба яўна вярнуць аб'ект.

Каб зрабіць гэта крыху больш зразумелым, давайце паглядзім на вуглавы зыходны код. Вось як выглядае функцыя factory ():

функцыя factory (імя, factoryFn, прымусіць) {return provider (імя, {$ get: прымусіць! == false? ExecuceReturnValue (імя, factoryFn): factoryFn}); }

Ён прымае імя і заводскую функцыю, якая перадаецца, і ў асноўным вяртае пастаўшчыка з такім жа імем, які мае $ get метад, які з'яўляецца нашай фабрычнай функцыяй. Дык што з гэтай справай пастаўшчыка? Калі вы пытаецеся інжэктар пра пэўную залежнасць, ён у асноўным просіць у адпаведнага пастаўшчыка асобнік гэтай паслугі, патэлефанаваўшы ў метад $ get (). Такім чынам, $ get () патрабуецца пры стварэнні правайдэраў.

Іншымі словамі, калі мы ўводзім MyService куды-небудзь, за кулісамі адбываецца наступнае:

MyServiceProvider. $ Get (); // вярнуць асобнік службы

Добра, фабрычныя функцыі выклікаюцца, што з кодам службы? Вось яшчэ адзін вытрымка:

Служба функцый (імя, канструктар) {return work (name, ['$ injector', function ($ injector) {return $ injector.instantiate (constructor);}]); }

Паглядзі, атрымліваецца, што калі мы тэлефануем у службу (), яна фактычна выклікае завод (). Аднак функцыя нашага канструктара па службе не проста перадаецца на завод, як ёсць. Ён перадае функцыю, якая прапануе інжэктару стварыць арыентацыю і пярэчыць паказанаму канструктару. Іншымі словамі: Служба выклікае загадзя зададзеную фабрыку, якая заканчваецца адпаведным правайдэрам як метад $ get (). $ injector.instantiate () - гэта метад, які ў канчатковым выніку выклікае Object.create () з функцыяй канструктара. Менавіта таму мы выкарыстоўваем гэта ў паслугах.

Добра, атрымліваецца, што незалежна ад таго, што мы выкарыстоўваем, службу () ці фабрыку (), мы заўсёды называем фабрыку, якая стварае пастаўшчыка для нашай службы. Што прывядзе нас да найбольш часта задаваных пытанняў у гісторыі Angular: якім я павінен карыстацца?

Які з іх выкарыстоўваць?

Заданне гэтага пытання ў Інтэрнэце прыводзіць нас да некаторых артыкулаў і адказаў StackOverflow. Першы - гэта адказ. Там напісана:

"У прынцыпе, розніца паміж абслугоўваннем і заводам заключаецца ў наступным:"

app.service ('myService', function () {// служба - гэта толькі функцыя канструктара // гэта называецца 'new' this.sayHello = function (name) {return "Прывітанне" + імя + "!";}; }); app.factory ('myFactory', function () {// завод вяртае аб'ект // Вы можаце загадзя выканаць код return {sayHello: function (name) {return "Прывітанне" + name + "!";}}}) ;

Мы ўжо ведаем, што адбываецца за кулісамі, але гэты адказ дадае яшчэ адзін каментар. У ім гаворыцца, што мы можам запусціць код, перш чым вернем аб'ект літаральна. У прынцыпе, мы можам зрабіць некаторыя этапы налады альбо стварыць аб'ект пры пэўных умовах альбо не. Здаецца, гэта немагчыма пры непасрэдным стварэнні службы. Па гэтай прычыне большасць рэсурсаў рэкамендуе выкарыстоўваць фабрыкі замест паслуг.

Што рабіць, калі я сказаў вам, што мы можам зрабіць тое ж самае з паслугамі?

Так, правільна. Служба - гэта функцыя канструктара, але гэта не перашкаджае нам выконваць дадатковыя працы і вяртаць аб'ектныя літаралы. На самай справе, функцыі канструктара ў JavaScript могуць вяртаць усё, што заўгодна. Вось як мы можам напісаць наш сэрвісны код, каб зрабіць тое ж самае, што і наш завод:

app.service ('MyService', function () {// мы таксама маглі б зрабіць тут дадатковую працу {sayHello: function () {console.log ('прывітанне');};}});

На жаль, што цяпер? Мы толькі што заўважылі, што ў залежнасці ад таго, як мы пішам нашыя паслугі, розніца паміж імі не існуе. Застаецца вялікае пытанне: якім мы павінны карыстацца?

З дапамогай сэрвісаў мы можам выкарыстоўваць класы ES6

Напісаць паслугі такім чынам, безумоўна, контрпрадуктыўна, таму што гэта называецца функцыяй канструктара і таму павінна выкарыстоўвацца як адна. Ці ёсць нейкая перавага перад іншымі? Так, ёсць. Аказваецца, што на самай справе лепш карыстацца паслугамі, калі гаворка ідзе пра пераход на ES6. Прычына гэтага проста ў тым, што служба - гэта функцыя канструктара, а фабрыка - не. Працуючы з функцыямі канструктара ў ES5, мы можам лёгка выкарыстоўваць класы ES6 пры пераходзе на ES6.

Напрыклад, мы можам перапісаць наш код у ES6 наступным чынам:

Клас MyService {сказаць прывітанне () {console.log ('прывітанне'); }} app.service ('MyService', MyService);

Клас ES6 на самой справе проста функцыя канструктара ў ES5. Мы пісалі пра гэта сёння, выкарыстоўваючы ES6 з Angular. Калі вы яшчэ не прачыталі гэты артыкул, рэкамендую праверыць яго.

Для мануфактур гэта немагчыма, таму што іх проста называюць функцыямі. Я спадзяюся, што гэты артыкул усё растлумачыў і заахвоціў людзей не выкарыстоўваць заводы для аказання паслуг, калі яны не ведаюць, чым карыстацца.


адказ 4:

Фабрыка для абслугоўвання?

Добра, пачнем з асноў

Angular мае ўбудаваныя сэрвісы, уключаючы "Паслугі" і "Фабрыкі".

На Фабрыцы вы ствараеце аб'ект, дадаеце яму ўласцівасці і вяртаеце той жа аб'ект.

Калі вы не адкрываеце аб'ект у сэрвісе, Angularjs стварыць яго за кадрам «новым» ключавым словам. У асноўным аб'ект ствараецца з дапамогай канструктарскай функцыі.

Блытаніна - давайце спрасцім яго з гэтым прыкладам.

app.service ('myService', serviceFunction)

app.factory ("myFactory", factoryFunction)

var serviceFunction = function () {

// тут вы прысвойваеце значэнні гэтай функцыі ключавое слова "гэта"

// За кулісамі, Angular аб'яўляе var this = {}

this.name = "abc ад службы",

// вярнуць, што

}

var factoryFunction = function () {

var someObject = {}

someObject.name = "abc ад фабрыкі";

вярнуць someObject.name;

}

app.controller ("myCtrl", функцыя (myService, myFactory) {

console.log ("Дадзеныя са службы", myService) // o / p serviceFunction: {"name": "abc ад службы"}

console.log ("Дадзеныя з завода", myFactory) // o / p "abc ад Factory"

})

У прынцыпе, увесь функцыянальны асобнік няяўна вяртаецца ... але на заводзе вы можаце вярнуць усё, што хочаце. Такім чынам, у вас ёсць больш кантролю на заводзе ў параўнанні з абслугоўваннем.

Спадзяюся, што гэта дае вам крыху ўяўленне пра тое, чым адрозніваюцца паслугі і фабрыка.

Калі вы хочаце, вы можаце запытаць дадатковыя тлумачэнні.


адказ 5:

Дзякуй за A2A. Няма вялікай розніцы. Вы можаце зрабіць тое ж самае ў абодвух выпадках. Аднак я б рэкамендаваў вам застацца з паслугамі. Паколькі JavaScript рухаецца да "класавых" структур, паслугі - найлепшы шлях дзеянняў. Напрыклад, калі ў вас была служба і перададзена функцыя, гэтая функцыя на самай справе клас. Так што калі вы выдалілі вугал са свайго праекта, вы ўсё яшчэ можаце выкарыстоўваць усё з сэрвісу.


адказ 6:

Розніца паміж службамі і заводамі

Добра, у чым розніца паміж сэрвісам і заводам у AngularJS? Як мы ўсе ведаем, мы можам вызначыць паслугу, як гэта:

app.service ('MyService', function () {this.sayHello = function () {console.log ('прывітанне');};});

.service () - гэта спосаб нашага модуля, які мае імя і функцыю, якая вызначае службу. Даволі лёгка. Пасля таго, як гэта будзе вызначана, мы можам убудаваць і выкарыстоўваць гэтую канкрэтную службу ў іншых кампанентах, такіх як элементы кіравання, дырэктывы і фільтры:

app.controller ('AppController', функцыя (MyService) {MyService.sayHello (); // часопісы 'Прывітанне'});

Добра, вядома. Цяпер тое самае, што і фабрыка:

app.factory ('MyService', function () {return {sayHello: function () {console.log ('прывітанне');}}});

Зноў жа .factory () - гэта спосаб у нашым модулі, а імя і функцыі выкарыстоўваюцца для вызначэння фабрыкі. Мы можам уводзіць і выкарыстоўваць рэч сапраўды так, як мы гэта зрабілі са службай. Якая тут розніца?

Ну, магчыма, вы ўбачыце, што замест таго, каб працаваць з ім на заводзе, мы вяртаем аб'ект літаральна. Чаму гэта? Аказваецца, служба - гэта канструктар, а фабрыка - не. Дзесьці глыбока ў гэтым вуглавым свеце знаходзіцца гэты код, які выклікае Object.create () з функцыяй канструктара службы, калі ён ствараецца. Аднак фабрычная функцыя - гэта проста функцыя, якая называецца, і таму нам трэба яўна вярнуць аб'ект.

Каб зрабіць гэта крыху больш зразумелым, давайце паглядзім на вуглавы зыходны код. Вось як выглядае функцыя factory ():

функцыя factory (імя, factoryFn, прымусіць) {return provider (імя, {$ get: прымусіць! == false? ExecuceReturnValue (імя, factoryFn): factoryFn}); }

Ён прымае імя і заводскую функцыю, якая перадаецца, і ў асноўным вяртае пастаўшчыка з такім жа імем, які мае $ get метад, які з'яўляецца нашай фабрычнай функцыяй. Дык што з гэтай справай пастаўшчыка? Калі вы пытаецеся інжэктар пра пэўную залежнасць, ён у асноўным просіць у адпаведнага пастаўшчыка асобнік гэтай паслугі, патэлефанаваўшы ў метад $ get (). Такім чынам, $ get () патрабуецца пры стварэнні правайдэраў.

Іншымі словамі, калі мы ўводзім MyServicesусюды, за кадрам адбываецца наступнае:

MyServiceProvider. $ Get (); // вярнуць асобнік службы

Добра, фабрычныя функцыі выклікаюцца, што з кодам службы? Вось яшчэ адзін вытрымка:

Служба функцый (імя, канструктар) {return work (name, ['$ injector', function ($ injector) {return $ injector.instantiate (constructor);}]); }

Паглядзі, атрымліваецца, што калі мы тэлефануем у службу (), яна фактычна выклікае завод (). Аднак функцыя нашага канструктара па службе не проста перадаецца на завод, як ёсць. Ён перадае функцыю, якая прапануе інжэктару стварыць арыентацыю і пярэчыць паказанаму канструктару. Іншымі словамі: Служба выклікае загадзя зададзеную фабрыку, якая заканчваецца адпаведным правайдэрам як метад $ get (). $ injector.instantiate () - гэта метад, які ў канчатковым выніку выклікае Object.create () з функцыяй канструктара. Менавіта таму мы выкарыстоўваем гэта ў паслугах.


адказ 7:

Вуглавы JS працуе, каб падзяліць праблемы. Для гэтага яна абапіраецца на службовую архітэктуру. Некаторыя ўбудаваныя функцыі, такія як $ location, $ http і г.д., былі прадастаўлены ў гэтым. Кожнай функцыі прызначаецца адно заданне. Гэта ўбудаваныя сэрвісы, якія папярэднічаюць знаку $. Аднак, калі мы хочам стварыць уласную службу, мы выкарыстоўваем метад абслугоўвання. Метад абслугоўвання - гэта API, які выкарыстоўваецца для стварэння функцый. Яны выкліканы падчас выканання. З іншага боку, заводскі метад - не іншы варыянт выкарыстання службовай архітэктуры. Ён можа выконваць працу сэрвіснага метаду, але гэта не тое, што службовы метад. fcatory метад стварае аб'екты ў адрозненне ад службы, API для стварэння метадаў. Давайце разбярэмся гэта на прыкладзе.

Функцыя getClass ($ http) {this.getClass = функцыя fetch () {return $ http.get ('class.htm'); }; } angular .module ('app') .service ('getClass', getClass);
Функцыя getClass ($ http) {return {// вяртае здачу аб'екта: function () {// функцыя, вызначаная ў гэтым аб'екце return $ http.get ('class.htm'); }}; } angular .module ('app') .factory ('getClass', getClass);

адказ 8:

Вуглавы JS працуе, каб падзяліць праблемы. Для гэтага яна абапіраецца на службовую архітэктуру. Некаторыя ўбудаваныя функцыі, такія як $ location, $ http і г.д., былі прадастаўлены ў гэтым. Кожнай функцыі прызначаецца адно заданне. Гэта ўбудаваныя сэрвісы, якія папярэднічаюць знаку $. Аднак, калі мы хочам стварыць уласную службу, мы выкарыстоўваем метад абслугоўвання. Метад абслугоўвання - гэта API, які выкарыстоўваецца для стварэння функцый. Яны выкліканы падчас выканання. З іншага боку, заводскі метад - не іншы варыянт выкарыстання службовай архітэктуры. Ён можа выконваць працу сэрвіснага метаду, але гэта не тое, што службовы метад. fcatory метад стварае аб'екты ў адрозненне ад службы, API для стварэння метадаў. Давайце разбярэмся гэта на прыкладзе.

Функцыя getClass ($ http) {this.getClass = функцыя fetch () {return $ http.get ('class.htm'); }; } angular .module ('app') .service ('getClass', getClass);
Функцыя getClass ($ http) {return {// вяртае здачу аб'екта: function () {// функцыя, вызначаная ў гэтым аб'екце return $ http.get ('class.htm'); }}; } angular .module ('app') .factory ('getClass', getClass);

адказ 9:

Вуглавы JS працуе, каб падзяліць праблемы. Для гэтага яна абапіраецца на службовую архітэктуру. Некаторыя ўбудаваныя функцыі, такія як $ location, $ http і г.д., былі прадастаўлены ў гэтым. Кожнай функцыі прызначаецца адно заданне. Гэта ўбудаваныя сэрвісы, якія папярэднічаюць знаку $. Аднак, калі мы хочам стварыць уласную службу, мы выкарыстоўваем метад абслугоўвання. Метад абслугоўвання - гэта API, які выкарыстоўваецца для стварэння функцый. Яны выкліканы падчас выканання. З іншага боку, заводскі метад - не іншы варыянт выкарыстання службовай архітэктуры. Ён можа выконваць працу сэрвіснага метаду, але гэта не тое, што службовы метад. fcatory метад стварае аб'екты ў адрозненне ад службы, API для стварэння метадаў. Давайце разбярэмся гэта на прыкладзе.

Функцыя getClass ($ http) {this.getClass = функцыя fetch () {return $ http.get ('class.htm'); }; } angular .module ('app') .service ('getClass', getClass);
Функцыя getClass ($ http) {return {// вяртае здачу аб'екта: function () {// функцыя, вызначаная ў гэтым аб'екце return $ http.get ('class.htm'); }}; } angular .module ('app') .factory ('getClass', getClass);

адказ 10:

Вуглавы JS працуе, каб падзяліць праблемы. Для гэтага яна абапіраецца на службовую архітэктуру. Некаторыя ўбудаваныя функцыі, такія як $ location, $ http і г.д., былі прадастаўлены ў гэтым. Кожнай функцыі прызначаецца адно заданне. Гэта ўбудаваныя сэрвісы, якія папярэднічаюць знаку $. Аднак, калі мы хочам стварыць уласную службу, мы выкарыстоўваем метад абслугоўвання. Метад абслугоўвання - гэта API, які выкарыстоўваецца для стварэння функцый. Яны выкліканы падчас выканання. З іншага боку, заводскі метад - не іншы варыянт выкарыстання службовай архітэктуры. Ён можа выконваць працу сэрвіснага метаду, але гэта не тое, што службовы метад. fcatory метад стварае аб'екты ў адрозненне ад службы, API для стварэння метадаў. Давайце разбярэмся гэта на прыкладзе.

Функцыя getClass ($ http) {this.getClass = функцыя fetch () {return $ http.get ('class.htm'); }; } angular .module ('app') .service ('getClass', getClass);
Функцыя getClass ($ http) {return {// вяртае здачу аб'екта: function () {// функцыя, вызначаная ў гэтым аб'екце return $ http.get ('class.htm'); }}; } angular .module ('app') .factory ('getClass', getClass);