angular.service vs angular.factory


1067

සේවා ප්‍රකාශ කිරීම සඳහා භාවිතා කරන angular.factory () සහ angular.service () යන දෙකම මම දැක ඇත්තෙමි ; කෙසේ වෙතත්, මට නිල ලේඛනවල කොතැනකවත් සොයාගත නොහැක angular.service .

ක්‍රම දෙක අතර වෙනස කුමක්ද?
කුමන දේ සඳහා භාවිතා කළ යුතුද (ඔවුන් විවිධ දේ කරයි යැයි උපකල්පනය කර)?



4
මම "[angularjs] සේවා කර්මාන්තශාලාව" සෙව්වෙමි, නමුත් ඒ පිළිබඳව දැනටමත් ප්‍රශ්නයක් ඇති බව මට මතකය.
මාර්ක් රාජ්කොක්

2
සෙවුමකදී, වර්ග වරහන් මඟින් ටැගයක් අදහස් කරනවාද?
ජාකොබ්

11
A ජාකොබ් චතුරස්ර වරහන් ඔබේ සෙවුම අඩු කරයි. [angularjs] විධානයන් - දැනටමත් angularjs සමඟ ටැග් කර ඇති ප්‍රශ්න සඳහා 'විධානයන්' සොයනු ඇත.
මහබුබ්

1
Ah මහබ්බ් වෙනත් වචන වලින් කිවහොත්, "ඔව්" :)
බ්‍රයන්

Answers:


1269
  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);

මෙම සංකල්පය මා මේ ආකාරයෙන් මා වෙතට ගෙන එන තුරු මෙම හිස වටා ඔතා ගැනීමට මට අපහසු විය:

සේවාව : ඔබ ලියන ශ්‍රිතය නව- එඩ් වනු ඇත :

  myInjectedService  <----  new myServiceFunction()

කර්මාන්තශාලාව : ඔබ ලියන ශ්‍රිතය (ඉදිකිරීම්කරු) කැඳවනු ලැබේ :

  myInjectedFactory  <---  myFactoryFunction()

ඔබ එය කරන දේ ඔබට භාරයි, නමුත් ප්‍රයෝජනවත් රටා කිහිපයක් තිබේ ...

පොදු API එකක් නිරාවරණය කිරීම සඳහා සේවා ශ්‍රිතයක් ලිවීම වැනි :

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

හෝ පොදු API එකක් හෙළි කිරීමට කර්මාන්තශාලා ශ්‍රිතයක් භාවිතා කිරීම :

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }
  
  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

හෝ ඉදිකිරීම්කරුවෙකු ආපසු ලබා දීම සඳහා කර්මාන්තශාලා ශ්‍රිතයක් භාවිතා කිරීම :

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

කුමන එකක් භාවිතා කළ යුතුද? ...

දෙකම සමඟ ඔබට එකම දේ කළ හැකිය. කෙසේ වෙතත්, සමහර අවස්ථාවලදී කර්මාන්ත ශාලාව මඟින් සරල වාක්‍ය ඛණ්ඩයක් සමඟ එන්නත් කළ හැකි ද්‍රව්‍යයක් නිර්මාණය කිරීමට ඔබට තව ටිකක් නම්‍යශීලී බවක් ලබා දෙයි. එයට හේතුව myInjectedService සැමවිටම වස්තුවක් විය යුතු අතර, myInjectedFactory යනු වස්තුවක්, ක්‍රියාකාරී යොමු කිරීමක් හෝ ඕනෑම අගයක් විය හැකිය. නිදසුනක් ලෙස, ඔබ ඉදිකිරීම්කරුවෙකු නිර්මාණය කිරීම සඳහා සේවාවක් ලියා ඇත්නම් (ඉහත අවසාන උදාහරණයේ දී මෙන්), එය ක්ෂණිකව කළ යුතුය:

var myShinyNewObject = new myInjectedService.myFunction()

මෙයට වඩා අඩු ප්‍රියතාවයක් ඇති:

var myShinyNewObject = new myInjectedFactory();

නිසා (නමුත් ඔබ මුලින්ම රටාව මෙම වර්ගයේ භාවිතා කරන ආකාරය පිළිබඳව කල්පනාකාරී විය යුතු නව ඔබේ පාලකයන් තුළ -ing වස්තූන් පරික්ෂා කිරීම සඳහා සමච්චල් කිරීම අපහසු බව දෘඩ-කිරීමට මාර්ගයේ පරායත්තයන් නිර්මාණය කරයි. වඩා හොඳ සේවාවක් ඇති කිරීම සඳහා වස්තූන් එකතුව ඔබ new()විලී-නිලි භාවිතා කරනවාට වඩා .)


තවත් දෙයක් නම්, ඒවා සියල්ලම සිංගල්ටන් ය ...

මෙම අවස්ථා දෙකෙහිම කෝණික මඟින් ඔබට තනි තනිව කළමනාකරණය කිරීමට උපකාරී වන බව මතක තබා ගන්න. ඔබ ඔබේ සේවාව හෝ ක්‍රියාකාරිත්වය එන්නත් කරන්නේ කොතැනද, කොපමණ වාරයක් වුවද, එකම වස්තුවකට හෝ ශ්‍රිතයකට එකම සඳහනක් ඔබට ලැබෙනු ඇත. (කර්මාන්තශාලාවක් හුදෙක් අංකයක් හෝ නූලක් වැනි අගයක් ලබා දෙන විට හැර. එවැනි අවස්ථාවකදී, ඔබට සැමවිටම එකම අගයක් ලැබෙනු ඇත, නමුත් යොමු කිරීමක් නොවේ.)


2
නිව්බල්ට වඩා එය වස්තු සාදන්නෙකු ලෙස හැඳින්වීම හොඳ ද?
markyzm

2
Ug හියුගෝ, මම පෙන්නුම් කළේ ඔබට දෙකම සමඟ එකම දේ effectively ලදායී ලෙස ඉටු කළ හැකි බවයි, එය වාක්‍ය ඛණ්ඩය වෙනස් වනු ඇත.
ගිල් බර්මන්

105
සේවා සහ කර්මාන්තශාලා අතර ඇති වෙනස ගැන මට විශ්වාස කිරීමට පෙර කොපමණ වාරයක් කියවිය
යුතුදැයි

10
"නව" වෙත පැවසීමට අපට දැනටමත් ක්‍රියා පදයක් ඇත, එය "ක්ෂණික" ය. යොමු කිරීම සඳහා පමණි. :)
sscarduzio

8
කර්මාන්තශාලා යනු ආයාචනා කරන ලද කාර්යයන් වන බැවින් ඔවුන්ට ඕනෑම දෙයක් ආපසු ලබා දිය හැකිය. අනෙක් අතට, සේවාවන් කෝණික මාර්ගයෙන් ක්ෂණිකව ලබා new fn()දී ඇති බැවින් ඒවා නිදසුනක් ආපසු ලබා දිය යුතුය.
ගිල් බර්මන්

318

සරලව කිවහොත් ..

// Service
service = (a, b) => {
  a.lastName = b;
  return a;
};

// Factory
factory = (a, b) => Object.assign({}, a, { lastName: b });

const fullName = { firstName: 'john' };

// Service
const lastNameService = (a, b) => {
  a.lastName = b;
  return a;
};
console.log(lastNameService(fullName, 'doe'));

// Factory
const lastNameFactory = (a, b) => 
  Object.assign({}, a, { lastName: b })
console.log(lastNameFactory(fullName, 'doe'));


169
මචන්, ස්තූතියි. අනෙක් පිළිතුරු වල විස්තර වලංගු නොවන බව නොවේ, නමුත් සමහර විට ඔබට තත්පර 10 අනුවාදය අවශ්‍ය වේ.
ආර් ක්ලැවන්

4
සේවා ශ්‍රිතය කිසිවක් ආපසු ලබා නොදෙන්න. මෙම this.name = ... එය API හෙලිදරව් කරන බව පෙන්වීමට තරම් වේ.
පික්සෙල්බිට්ස්

3
කෙසේ වෙතත් ඔබ ආපසු පැමිණ විරෝධය දැක්වුවහොත් එය ඒ වෙනුවට භාවිතා කරනු ඇත. jsfiddle.net/Ne5P8/1221
MrB

RMrB, එය සාමාන්‍ය ජාවාස්ක්‍රිප්ට් අංගයක් වන අතර එය කෝණික හෝ මෙම ප්‍රශ්නයේ සන්දර්භයට විශේෂිත නොවේ.
ඕම් ශංකර්

M ඕම් ශංකර්, ඉහත පිළිතුරෙන් පෙන්නුම් කරන්නේ වෙනස වන්නේ ආපසු එවන ලද වස්තුවක් භාවිතා කිරීමයි. "මෙය" යනු සේවාවක් සමඟ භාවිතා කරන පෙරනිමි අගය බව ඔබ පෙන්වුවද ඔබ වටිනාකමක් ආපසු ලබා දුන්නොත් එය හරියටම කර්මාන්ත ශාලාවක් මෙන් ක්‍රියා කරයි. කෙසේවෙතත්, කර්මාන්තශාලාවකට ආපසු වටිනාකමක් අවශ්‍ය බව පෙනේ නම් වෙනත් දෝෂයක් සිදුවනු ඇත - (මෙම උදාහරණයේ පෙන්වා ඇත - jsfiddle.net/hmoc0q3v/1 ).
MrB

247

මූලික වෙනස්කම් මෙන්න:

සේවාවන්

වාක්‍ය ඛණ්ඩය: module.service( 'serviceName', function );

ප්රතිඵලය: ඔබ ලබා දීමට කටයුතු කරනු ලැබේ ක එන්නත් තර්කයක් ලෙස serviceName ප්රකාශ කරන විට ශ්රිතයක උදාහරණයක් කිරීමට සමත් module.service.

භාවිතය: එන්නත් කරන ලද ශ්‍රිත යොමුවකට සරලව එකතු කිරීමෙන් ආයාචනා කිරීමට ප්‍රයෝජනවත් වන උපයෝගිතා කාර්යයන් බෙදා ගැනීමට ප්‍රයෝජනවත් විය හැකිය ( ). ඒ injectedArg.call( this )හා සමාන හෝ ධාවනය කළ හැකිය .

කර්මාන්තශාලා

වාක්‍ය ඛණ්ඩය: module.factory( 'factoryName', function );

ප්රතිඵලය: factoryName ඔබ ලබා දීමට කටයුතු කරනු ලැබේ ක එන්නත් තර්කයක් ලෙස ප්රකාශ කළ විට එම උත්සවයට යොමු යොදාගැනීම මගින් ආපසු එම අගය කිරීමට සමත් module.factory.

භාවිතය: 'පංති' ශ්‍රිතයක් නැවත ලබා දීම සඳහා ප්‍රයෝජනවත් විය හැකි අතර පසුව එය නව අවස්ථා නිර්මාණය කළ හැකිය.

සේවා සහ කර්මාන්තශාලා භාවිතා කරන උදාහරණය මෙන්න . AngularJS Service vs Factory ගැන වැඩිදුර කියවන්න .

ඔබට එදිරිව කෝණික ජේඑස් ප්‍රලේඛනය සහ සේවා හා කර්මාන්තශාලා අතර ව්‍යාකූලත්වයට පත්ව ඇති ස්ටැක් ඕවර් ප්‍රවාහය පිළිබඳ ප්‍රශ්නය පරීක්ෂා කළ හැකිය .


27
ඔබේ උදාහරණ කර්මාන්ත ශාලාවක් භාවිතා කිරීම ගැන මම එකඟ නොවෙමි. සේවා සහ කර්මාන්තශාලා යන දෙකම (ශ්‍රිතයක් ආපසු ලබා දී ඇතැයි සිතමු. එය වටිනාකමක් හෝ වස්තුවක් විය හැකිය) අලුත් කළ හැකිය. ඇත්ත වශයෙන්ම සේවාවක් යනු ඔබට ක්‍රියාකාරී අවස්ථාවක් ලබා දී ඇති බැවින් අළුත් විය හැකි බවට සහතික වන එකම විකල්පයයි. සේවාවක් හරහා ෆැක්ටරියක් භාවිතා කිරීමේ වාසිය නම්, එමඟින් දේපලවලට පුද්ගලික හා පොදු වශයෙන් යම් ප්‍රවේශයක් පාලනය කිරීමට ඉඩ සලසන අතර සේවයේ සියලුම දේපල ස්වභාවයෙන්ම නිරාවරණය වේ. මම සැපයුම්කරුවෙකු කර්මාන්ත ශාලාවක කර්මාන්ත ශාලාවක් ලෙස සිතමි - එය එන්නත් කළ හැකි සහ වින්‍යාසගත කළ හැකි වේලාවේදී පමණි.
ඩ්‍රූ ආර්

1
RewDrewR ඔබගේ අදහස් දැක්වීමට ස්තූතියි, කර්මාන්ත ශාලාවක් භාවිතා කරන රාජ්‍ය හා පෞද්ගලික ක්‍රම පිළිබඳ හොඳ උදාහරණයක් මට හමු විය: stackoverflow.com/a/14904891/65025
edzillion

ඇත්ත වශයෙන්ම මට මේ සම්බන්ධයෙන් @DrewR සමඟ එකඟ විය යුතුය. මම මීට පෙර වස්තූන් ආපසු ලබා දීමට කර්මාන්තශාලා භාවිතා කර ඇත්තෙමි, නමුත් අවංකවම මේ අවස්ථාවේ දී එය $providersසෑම විටම භාවිතා කිරීම වටී .
jedd.ahyoung

සේවාව ස්වයංක්‍රීයව ඉදිකිරීම්කරු ස්ථාපනය කරයි, නේද?
අඟහරු 2049

1
Rew ඩ්‍රූආර් - මගේ අවබෝධයෙන්, කර්මාන්ත ශාලාවක් සමඟ ඔබට කළ හැකි සේවාවෙන් ඔබට නව ප්‍රති effect ල ලබා ගත හැකි බව සත්‍යයකි, නමුත් එය අදහස් කරන්නේ එය නොවේ. එහි ප්‍රධාන ඉලක්කය වන්නේ ඔබට යම් උපයෝගීතා වස්තුවක් ආපසු ලබා දීමට අවශ්‍ය වූ විට සහ එය වඩාත් සුදුසු වාක්‍ය ඛණ්ඩයක් සපයන විට - ඔබට this.myFunc = function(){}ඔබේ සේවාවේ සරලව ලිවිය හැකිය (ඔබ කර්මාන්ත ශාලාවක් සමඟ කළ යුතු දේ වැනි වස්තුව නිර්මාණය කිරීම සඳහා කේත ලිවීමෙන් ඔබව ගලවා ගනී. ).
BornToCode

137

TL; DR

1) ඔබ කර්මාන්ත ශාලාවක් භාවිතා කරන විට ඔබ වස්තුවක් නිර්මාණය කර එයට ගුණාංග එකතු කර එම වස්තුවම ආපසු එවන්න. ඔබ මෙම කර්මාන්තශාලාව ඔබේ පාලකයට ඇතුළු කළ විට, එම වස්තුවෙහි ඇති ගුණාංග දැන් ඔබේ කර්මාන්ත ශාලාව හරහා එම පාලකයේ තිබේ.

app.controller('myFactoryCtrl', function($scope, myFactory){
  $scope.artist = myFactory.getArtist();
});

app.factory('myFactory', function(){
  var _artist = 'Shakira';
  var service = {};

  service.getArtist = function(){
    return _artist;
  }

  return service;
});


2) ඔබ සේවාව භාවිතා කරන විට , කෝණික තිරය පිටුපස එය 'නව' මූල පදය සමඟ සවි කරයි. එම හේතුව නිසා, ඔබ 'මේ' වෙත දේපල එකතු කරන අතර සේවාව 'මෙය' නැවත ලබා දෙනු ඇත. ඔබ ඔබේ පාලකයට සේවාව ලබා දුන් විට, 'මේ' හි ඇති ගුණාංග දැන් ඔබේ සේවාව හරහා එම පාලකයට ලබා ගත හැකිය.

app.controller('myServiceCtrl', function($scope, myService){
  $scope.artist = myService.getArtist();
});

app.service('myService', function(){
  var _artist = 'Nelly';
  this.getArtist = function(){
    return _artist;
  }
});



ටීඑල් නොවන; ඩී.ආර්

1) කර්මාන්තශාලා
කර්මාන්තශාලා යනු සේවාවක් නිර්මාණය කිරීමට සහ වින්‍යාස කිරීමට වඩාත්ම ජනප්‍රිය ක්‍රමයයි. ටීඑල්; ඩීආර් පැවසූ දෙයට වඩා වැඩි යමක් නැත. ඔබ වස්තුවක් සාදන්න, එයට ගුණාංග එකතු කරන්න, ඉන්පසු එම වස්තුවම ආපසු දෙන්න. ඔබ කර්මාන්තශාලාව ඔබේ පාලකයට ඇතුළු කළ විට, එම වස්තුවෙහි ඇති ගුණාංග දැන් ඔබේ කර්මාන්තශාලාව හරහා එම පාලකයේ තිබේ. වඩාත් පුළුල් උදාහරණයක් පහතින්.

app.factory('myFactory', function(){
  var service = {};
  return service;
});

දැන් අපි 'සේවාවට' අනුයුක්ත කරන ඕනෑම ගුණාංගයක් අපගේ පාලකයට 'myFactory' සමත් වූ විට අපට ලබා ගත හැකිය.

දැන් අපි අපගේ ඇමතුම් ආපසු ගැනීමේ කාර්යයට 'පුද්ගලික' විචල්‍යයන් කිහිපයක් එකතු කරමු. මේවා පාලකයෙන් කෙලින්ම ප්‍රවේශ විය නොහැකි නමුත් අවශ්‍ය විටෙක මෙම 'පුද්ගලික' විචල්‍යයන් වෙනස් කිරීමට හැකිවන පරිදි අපි 'සේවාව' මත යම්කිසි / සැකසුම් ක්‍රම කිහිපයක් සකස් කරමු.

app.factory('myFactory', function($http, $q){
  var service = {};
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
   _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK';
    return _finalUrl
  }

  return service;
});

මෙහිදී ඔබ දකිනු ඇත්තේ අප එම විචල්‍යයන් / ක්‍රියාකාරිත්වය 'සේවාවට' අනුයුක්ත නොකරන බවයි. අපි ඒවා නිර්මාණය කරන්නේ පසුව ඒවා භාවිතා කිරීම හෝ වෙනස් කිරීම සඳහා ය.

  • baseUrl යනු අයිටියුන්ස් API ට අවශ්‍ය මූලික URL ය
  • _artist යනු අප සොයා බැලීමට කැමති කලාකරුවා ය
  • _finalUrl යනු අයිටියුන්ස් වෙත අප ඇමතුමක් ලබා දෙන අවසාන සහ සම්පුර්ණයෙන්ම සාදන ලද URL ය. අපගේ අයිටියුන්ස් හිතකාමී URL නිර්මාණය කර නැවත ලබා දෙන ශ්‍රිතයකි.

දැන් අපගේ සහායක / පෞද්ගලික විචල්‍යයන් සහ ක්‍රියාකාරිත්වය ක්‍රියාත්මක වන බැවින්, අපි 'සේවා' වස්තුවට ගුණාංග කිහිපයක් එකතු කරමු. අප 'සේවාව' මත තැබුවද, අපි 'myFactory' පසු කරන ඕනෑම පාලකයක directly ජුව භාවිතා කිරීමට අපට හැකි වේ.

අපි setArtist සහ getArtist ක්‍රම නිර්මාණය කිරීමට යන්නේ කලාකරුවා නැවත පැමිණීමට හෝ සැකසීමට ය. අපගේ නිර්මාණය කළ URL සමඟ අයිටියුන්ස් ඒපීඅයි යනුවෙන් හැඳින්වෙන ක්‍රමයක් ද අපි නිර්මාණය කිරීමට යන්නෙමු. මෙම ක්‍රමය මඟින් අයිටියුන්ස් ඒපීඅයි වෙතින් දත්ත නැවත පැමිණි පසු ඉටු වන පොරොන්දුවක් ලබා දෙනු ඇත. ඔබට කෝණික භාෂාවෙන් පොරොන්දු භාවිතා කර අත්දැකීම් නොමැති නම්, ඒවා පිළිබඳව ගැඹුරු කිමිදීමක් කිරීමට මම තරයේ නිර්දේශ කරමි.

SetArtist ට පහළින් කලාකරුවෙකු පිළිගෙන කලාකරුවා සැකසීමට ඔබට ඉඩ සලසයි. getArtist අපගේ $ http ඉල්ලීම සමඟ අප භාවිතා කරන URL එක තැනීම සඳහා ඇමතුම අයිටියුන්ස් විසින් මුලින්ම makeUrl () අමතයි. එවිට එය පොරොන්දු වස්තුවක් සකසයි, අපගේ අවසන් යූආර්එල් සමඟ request http ඉල්ලීමක් කරයි, එවිට $ http පොරොන්දුවක් ලබා දෙන නිසා, අපගේ ඉල්ලීමෙන් පසු .සකස් හෝ .දොර ලෙස ඇමතිය හැකිය. පසුව අපි අයිටියුන්ස් දත්ත සමඟ අපගේ පොරොන්දුව විසඳා ගනිමු, නැතහොත් 'දෝෂයක් ඇති බව' පණිවිඩයක් මගින් ප්‍රතික්ෂේප කරමු.

app.factory('myFactory', function($http, $q){
  var service = {};
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  service.setArtist = function(artist){
    _artist = artist;
  }

  service.getArtist = function(){
    return _artist;
  }

  service.callItunes = function(){
    makeUrl();
    var deferred = $q.defer();
    $http({
      method: 'JSONP',
      url: _finalUrl
    }).success(function(data){
      deferred.resolve(data);
    }).error(function(){
      deferred.reject('There was an error')
    })
    return deferred.promise;
  }

  return service;
});

දැන් අපේ කර්මාන්ත ශාලාව සම්පූර්ණයි. අපට දැන් ඕනෑම පාලකයකුට 'myFactory' එන්නත් කළ හැකි අතර අපගේ සේවා වස්තුවට (setArtist, getArtist, සහ callItunes) අමුණා ඇති අපගේ ක්‍රමවේදයන් ඇමතීමට අපට හැකි වේ.

app.controller('myFactoryCtrl', function($scope, myFactory){
  $scope.data = {};
  $scope.updateArtist = function(){
    myFactory.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myFactory.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }
});

ඉහත පාලකයේ අපි 'myFactory' සේවාවට එන්නත් කරමු. ඉන්පසු අපි 'myFactory' වෙතින් දත්ත වලින් එන අපගේ $ විෂය පථය මත ගුණාංග සකස් කරමු. ඉහත ඇති එකම උපක්‍රම කේතය නම් ඔබ මීට පෙර කිසි දිනෙක පොරොන්දු සමඟ කටයුතු නොකළේ නම්. කෝල් අයිටියුන්ස් පොරොන්දුවක් ලබා දෙන නිසා, අපට .තන් () ක්‍රමය භාවිතා කළ හැකි අතර අයිටියුන්ස් දත්ත සමඟ අපගේ පොරොන්දුව ඉටු වූ පසු $ scope.data.artistData පමණක් සකසන්න. අපගේ පාලකය ඉතා සිහින් බව ඔබට පෙනෙනු ඇත. අපගේ සියලු තාර්කික හා නිරන්තර දත්ත පිහිටා ඇත්තේ අපගේ පාලකයේ නොව අපගේ සේවාවේ ය.

2) සේවය
සේවාවක් නිර්මාණය කිරීමේදී ගනුදෙනු කිරීමේදී දැනගත යුතු ලොකුම දෙය නම් එය 'නව' මූල පදය සමඟ ක්ෂණිකව ක්‍රියාත්මක වීමයි. ඔබට ජාවාස්ක්‍රිප්ට් ගුරු වරුන් සඳහා මෙය කේතයේ ස්වභාවය පිළිබඳව විශාල ඉඟියක් ලබා දිය යුතුය. ජාවාස්ක්‍රිප්ට් හි සීමිත පසුබිමක් ඇති ඔබ සඳහා හෝ 'නව' මූල පදය ඇත්ත වශයෙන්ම කරන්නේ කුමක්ද යන්න ගැන එතරම් අවබෝධයක් නැති අය සඳහා, සේවාවක ස්වභාවය අවබෝධ කර ගැනීමට අපට උපකාරී වන ජාවාස්ක්‍රිප්ට් මූලධර්ම කිහිපයක් සමාලෝචනය කරමු.

ඔබ 'නව' මූල පදය සමඟ ශ්‍රිතයක් කැඳවන විට සිදුවන වෙනස්කම් සැබවින්ම දැකීමට, අපි ශ්‍රිතයක් නිර්මාණය කර එය 'නව' යතුරුපදය සමඟ ආයාචනා කරමු, ඉන්පසු 'නව' මූල පදය දකින විට පරිවර්තකයා කරන්නේ කුමක්දැයි පෙන්වමු. අවසාන ප්‍රති results ල දෙකම එක හා සමාන වේ.

මුලින්ම අපි අපේ ඉදිකිරීම්කරු නිර්මාණය කරමු.

var Person = function(name, age){
  this.name = name;
  this.age = age;
}

මෙය සාමාන්‍ය ජාවාස්ක්‍රිප්ට් ඉදිකිරීම් ශ්‍රිතයකි. දැන් අපි 'නව' මූල පදය භාවිතා කරමින් පුද්ගල ශ්‍රිතය ඉල්ලා සිටින සෑම විටම, 'මෙය' අලුතින් සාදන ලද වස්තුවට බැඳී ඇත.

දැන් අපි අපගේ පුද්ගලයාගේ මූලාකෘතියට ක්‍රමයක් එකතු කරමු, එවිට එය අපගේ පුද්ගල 'පන්තියේ' සෑම අවස්ථාවකම ලබා ගත හැකිය.

Person.prototype.sayName = function(){
  alert('My name is ' + this.name);
}

දැන්, අපි sayName ශ්‍රිතය මූලාකෘතියට ඇතුළත් කර ඇති නිසා, පුද්ගලයාගේ සෑම අවස්ථාවකටම එම නාමයේ නම දැනුම් දීම සඳහා sayName ශ්‍රිතය ඇමතීමට හැකි වේ.

දැන් අපට අපගේ පුද්ගල ඉදිකිරීම්කරු ශ්‍රිතය සහ එහි sayName ශ්‍රිතය එහි මූලාකෘතියේ ඇත, ඇත්ත වශයෙන්ම අපි පුද්ගලයාගේ නිදසුනක් නිර්මාණය කරමු.

var tyler = new Person('Tyler', 23);
tyler.sayName(); //alerts 'My name is Tyler'

එබැවින් පුද්ගල ඉදිකිරීම්කරුවෙකු නිර්මාණය කිරීම, එහි මූලාකෘතියට ශ්‍රිතයක් එක් කිරීම, පුද්ගල නිදසුනක් නිර්මාණය කිරීම සහ එහි මූලාකෘතිය මත ශ්‍රිතය ඇමතීම යන සියල්ලම එකට පෙනේ.

var Person = function(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.sayName = function(){
  alert('My name is ' + this.name);
}
var tyler = new Person('Tyler', 23);
tyler.sayName(); //alerts 'My name is Tyler'

දැන් අපි ජාවාස්ක්‍රිප්ට් හි 'නව' මූල පදය භාවිතා කරන විට ඇත්ත වශයෙන්ම සිදුවන්නේ කුමක්දැයි සොයා බලමු. ඔබ සැලකිල්ලට ගත යුතු පළමු දෙය නම්, අපගේ උදාහරණයේ 'නව' භාවිතා කිරීමෙන් පසුව, අපට 'ටයිලර්' මත ක්‍රමයක් (sayName) ඇමතීමට හැකි වන්නේ එය වස්තුවක් සේ ය - එයට හේතුව එයයි. ඉතින් පළමුව, අපගේ පුද්ගල ඉදිකිරීම්කරු වස්තුවක් ආපසු ලබා දෙන බව අපි දනිමු, එය කේතයෙන් අපට දැකිය හැකි වුවත් නැතත්. දෙවනුව, අපගේ sayName ශ්‍රිතය මූලාකෘතිය මත පිහිටා ඇති අතර එය සෘජුවම පුද්ගල උදාහරණය මත නොව, පුද්ගල ශ්‍රිතය නැවත පැමිණෙන වස්තුව අසාර්ථක බැලීම් මත එහි මූලාකෘතියට පැවරිය යුතු බව අපි දනිමු. වඩාත් සරළව කිවහොත්, අපි tyler.sayName () ලෙස හඳුන්වන විට පරිවර්තකයා පවසන්නේ “හරි, මම දැන් නිර්මාණය කළ 'ටයිලර්' වස්තුව දෙස බලන්නෙමි, sayName ශ්‍රිතය සොයාගෙන එය අමතන්න. විනාඩියක් ඉන්න, මට එය මෙහි නොපෙනේ - මා දකින සියල්ල නම සහ වයස පමණි, මට මූලාකෘතිය පරීක්ෂා කිරීමට ඉඩ දෙන්න. ඔව්, එය මූලාකෘතියේ ඇති බව පෙනේ, මට එය අමතන්න ඉඩ දෙන්න. ”.

පහත දැක්වෙන්නේ ජාවාස්ක්‍රිප්ට් හි 'නව' මූල පදය සැබවින්ම කරන්නේ කුමක්ද යන්න ගැන ඔබට සිතිය හැකි ආකාරයයි. එය මූලික වශයෙන් ඉහත ඡේදයේ කේත උදාහරණයකි. මම 'පරිවර්තක දර්ශනය' හෝ පරිවර්තකයා සටහන් ඇතුළත කේතය දකින ආකාරය තබා ඇත.

var Person = function(name, age){
  //The line below this creates an obj object that will delegate to the person's prototype on failed lookups.
  //var obj = Object.create(Person.prototype);

  //The line directly below this sets 'this' to the newly created object
  //this = obj;

  this.name = name;
  this.age = age;

  //return this;
}

දැන් ජාවාස්ක්‍රිප්ට් හි 'නව' මූල පදය සැබවින්ම කරන්නේ කුමක්ද යන්න පිළිබඳ දැනුමක් තිබීම, කෝණික සේවාවක් නිර්මාණය කිරීම තේරුම් ගැනීමට පහසු විය යුතුය.

සේවාවක් නිර්මාණය කිරීමේදී තේරුම් ගත යුතු ලොකුම දෙය නම්, 'නව' මූල පදය සමඟ සේවාවන් ක්ෂණිකව ක්‍රියාත්මක වන බව දැන ගැනීමයි. ඉහත සඳහන් උදාහරණ සමඟ එම දැනුම සංයෝජනය කරමින්, ඔබ දැන් ඔබේ දේපල හා ක්‍රමවේදයන් 'මේ' වෙත කෙලින්ම අනුයුක්ත කරන බව හඳුනාගත යුතුය. මෙය ක්‍රියාවෙන් බලමු.

අප මුලින් කර්මාන්තශාලා උදාහරණයෙන් කළ දෙයට වඩා වෙනස්ව, අපට වස්තුවක් නිර්මාණය කිරීමට අවශ්‍ය නොවන අතර එම වස්තුව නැවත ලබා දෙන්න. මක්නිසාද යත්, කලින් සඳහන් කළ පරිදි, අපි 'නව' මූල පදය භාවිතා කළ නිසා පරිවර්තකයා එම වස්තුව නිර්මාණය කරනු ඇත. එය මූලාකෘතියකි, පසුව අප විසින් එම කාර්යය නොකර එය අපට ලබා දෙන්න.

පළමුවෙන්ම පළමුව, අපගේ 'පුද්ගලික' සහ සහායක ක්‍රියාකාරිත්වය නිර්මාණය කරමු. අපගේ කර්මාන්තශාලාව සමඟ අප එකම දේ කළ බැවින් මෙය ඉතා හුරුපුරුදු විය යුතුය. එක් එක් පේළිය මෙහි කරන්නේ කුමක්දැයි මම පැහැදිලි නොකරමි, මන්ද මම එය කළේ කර්මාන්තශාලා උදාහරණයේ දී, ඔබ ව්‍යාකූල නම්, කර්මාන්තශාලා උදාහරණය නැවත කියවන්න.

app.service('myService', function($http, $q){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }
});

දැන්, අපගේ පාලකයේ ඇති අපගේ සියලු ක්‍රම 'මේ' වෙත අමුණන්නෙමු.

app.service('myService', function($http, $q){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  this.setArtist = function(artist){
    _artist = artist;
  }

  this.getArtist = function(){
    return _artist;
  }

  this.callItunes = function(){
    makeUrl();
    var deferred = $q.defer();
    $http({
      method: 'JSONP',
      url: _finalUrl
    }).success(function(data){
      deferred.resolve(data);
    }).error(function(){
      deferred.reject('There was an error')
    })
    return deferred.promise;
  }

});

දැන් අපගේ කර්මාන්තශාලාවේදී මෙන්, setArtist, getArtist, සහ callItunes අප විසින් කුමන සේවාවක් වෙත ඇතුළු කළත් ඕනෑම පාලකයකින් ලබා ගත හැකිය. මෙන්න myService පාලකය (එය අපගේ කර්මාන්තශාලා පාලකයට සමාන වේ).

app.controller('myServiceCtrl', function($scope, myService){
  $scope.data = {};
  $scope.updateArtist = function(){
    myService.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myService.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }
});

මා කලින් සඳහන් කළාක් මෙන්, 'නව' කරන්නේ කුමක්දැයි ඔබ සැබවින්ම වටහා ගත් පසු, සේවාවන් කෝණික කර්මාන්තශාලාවලට බොහෝ දුරට සමාන වේ.


12
ඔබේ බ්ලොග් අඩවියට කෙලින්ම සබැඳියක් ලබා දීමට ඔබට අවශ්‍ය විය හැකිය. tylermcginnis.com/angularjs-factory-vs-service-vs-provider කියවීමට ටිකක් පහසු බව මට පෙනී ගියේය.
ටයිලර් කොලියර්

3
ඔබේ බ්ලොග් අඩවිය මෙහි පුනරාවර්තනය කිරීම ගැන නොටින් වැරදියි, නමුත් එය හොඳ බ්ලොග් සටහනක් බව මම එකඟ වෙමි.
ආර් ක්ලැවන්

5
සෑම කෙනෙකුම කබාය යටතේ කරන දේ පිළිබඳ හොඳ සවිස්තරාත්මක පැහැදිලි කිරීමක්, නමුත් යමෙකු කර්මාන්ත ශාලාවක් හරහා සේවාවක් භාවිතා කිරීමට තෝරා ගන්නේ ඇයි සහ කවදාද යන්න තවමත් පැහැදිලි නැත. වෙනත් වචන වලින් කිවහොත්, කර්මාන්ත ශාලාවක් විසින් ආපසු ලබා දුන් එදිරිව එදිරිව නව වස්තුවක් ලබා ගැනීමට මා කැමති වන්නේ කවදාද? මම හිතන්නේ මේක තමයි ලොකුම ව්‍යාකූලත්වය.
demisx

2
මූලික වශයෙන්, ඔබට නිරන්තර සම්බන්ධතාවයක් (උදාහරණ සම්බන්ධතා, ඇමතුම් ඉතිහාසය, දත්ත ආචයනය) සමඟ උදාහරණයේ සඳහන් අයිටියුන්ස් ඒපීඅයි වැනි දුරස්ථ සේවාවක් සඳහා නිරන්තර සම්බන්ධතාවයක් නිර්මාණය කිරීමට අවශ්‍ය නම්, ඔබට කර්මාන්ත ශාලාව සමඟ යා හැකිය. ඔබ එය සේවාවක් ලෙස ක්‍රියාත්මක කරන්නේ නම්, ඔබට API වෙතින් යමක් අවශ්‍ය සෑම අවස්ථාවකම ඔබට සම්බන්ධතාවය නැවත නිර්මාණය කළ හැකි අතර එහි කිසිවක් ගබඩා කළ නොහැක. ඔබ සේවාව නැවත නිර්මාණය කරන සෑම අවස්ථාවකම ඔබට හිස් / පෙරනිමි වස්තුවක් ලැබෙනු ඇත.
මෙකි

4
එය නිවැරදි යැයි මම නොසිතමි, අස්නිම්. අනෙක් අය පවසා ඇති පරිදි, දෙකම තනි බොත්තම් සපයයි.
ක්‍රිප්ටෝ වයිරස්

35

හෝඩුවාව නමින් ඇත

සේවා සහ කර්මාන්තශාලා එකිනෙකට සමාන ය. දෙකම වෙනත් වස්තූන් තුළට එන්නත් කළ හැකි තනි වස්තුවක් ලබා දෙන අතර ඒවා බොහෝ විට එකිනෙකට වෙනස් ලෙස භාවිතා කරයි.

විවිධ මෝස්තර රටා ක්‍රියාත්මක කිරීම සඳහා ඒවා අර්ථාන්විතව භාවිතා කිරීමට අදහස් කෙරේ.

සේවා යනු සේවා රටාවක් ක්‍රියාත්මක කිරීම සඳහා ය

සේවා රටාවක් යනු ඔබේ යෙදුම තාර්කිකව ස්ථාවර ක්‍රියාකාරීත්ව ඒකකවලට කැඩී ඇති එකකි. උදාහරණයක් ලෙස API ප්‍රවේශකයෙක් හෝ ව්‍යාපාර තර්කනයක් විය හැකිය.

කෝණික ආකෘති වල මෙය විශේෂයෙන් වැදගත් වන්නේ කෝණික ආකෘති සාමාන්‍යයෙන් සේවාදායකයකින් ඇද ගන්නා ලද JSON වස්තු පමණක් වන අතර අපගේ ව්‍යාපාර තර්කනය ඉදිරිපත් කිරීමට අපට කොතැනක හෝ අවශ්‍ය වේ.

මෙන්න ගිතුබ් සේවාවක්. එය ගිතුබ් සමඟ කතා කරන්නේ කෙසේදැයි දනී. එය යූආර්එල් සහ ක්‍රම ගැන දනී. අපට එය පාලකයකට එන්නත් කළ හැකි අතර, එය පොරොන්දුවක් ජනනය කර ආපසු ලබා දෙනු ඇත.

(function() {
  var base = "https://api.github.com";

  angular.module('github', [])
    .service('githubService', function( $http ) {
      this.getEvents: function() {
        var url = [
          base,
          '/events',
          '?callback=JSON_CALLBACK'
        ].join('');
        return $http.jsonp(url);
      }
    });
  )();

කර්මාන්තශාලා කර්මාන්තශාලා රටාවක් ක්‍රියාත්මක කරයි

කර්මාන්තශාලා, අනෙක් අතට කර්මාන්තශාලා රටාවක් ක්‍රියාත්මක කිරීමට අදහස් කරයි. වස්තුවක් ජනනය කිරීම සඳහා අප කර්මාන්තශාලා ශ්‍රිතයක් භාවිතා කරන කර්මාන්තශාලා රටාවක්. සාමාන්‍යයෙන් අපි මෙය ආකෘති ගොඩනැගීම සඳහා භාවිතා කළ හැකිය. කර්තෘ ඉදිකිරීම්කරුවෙකු ආපසු ලබා දෙන කර්මාන්ත ශාලාවක් මෙන්න:

angular.module('user', [])
  .factory('User', function($resource) {
    var url = 'http://simple-api.herokuapp.com/api/v1/authors/:id'
    return $resource(url);
  })

අපි මේ ආකාරයට භාවිතා කරමු:

angular.module('app', ['user'])
  .controller('authorController', function($scope, User) {
    $scope.user = new User();
  })

කර්මාන්තශාලා ද සිංගල්ටන් ආපසු ලබා දෙන බව සලකන්න.

කර්මාන්තශාලාවලට ඉදිකිරීම්කරුවෙකු ආපසු ලබා දිය හැකිය

කර්මාන්තශාලාවක් හුදෙක් වස්තුවක් ආපසු ලබා දෙන නිසා, අප ඉහත දකින පරිදි, ඉදිකිරීම්කරු ශ්‍රිතයක් ඇතුළුව ඔබ කැමති ඕනෑම වස්තුවක් එයට ආපසු ලබා දිය හැකිය.

කර්මාන්තශාලා වස්තුවක් ආපසු ලබා දෙයි; සේවාවන් අලුත් ය

තවත් තාක්ෂණික වෙනසක් වන්නේ සේවා සහ කර්මාන්තශාලා රචනා කරන ආකාරයයි. වස්තුව උත්පාදනය කිරීම සඳහා සේවා ශ්‍රිතයක් අලුත් කරනු ලැබේ. කර්මාන්තශාලා ශ්‍රිතයක් කැඳවනු ලබන අතර එය වස්තුව නැවත ලබා දෙනු ඇත.

  • සේවාවන් නව ඉදිකිරීම්කරුවන් වේ.
  • කර්මාන්තශාලා හුදෙක් හැඳින්වෙන අතර වස්තුවක් ආපසු ලබා දේ.

මෙයින් අදහස් කරන්නේ සේවාවකදී, අපි "මෙය" එකතු කරන අතර, එය ඉදිකිරීම්කරුවෙකුගේ සන්දර්භය තුළ, ඉදිවෙමින් පවතින වස්තුව වෙත යොමු කරනු ඇත.

මෙය නිදර්ශනය කිරීම සඳහා, සේවාවක් සහ කර්මාන්ත ශාලාවක් භාවිතා කර නිර්මාණය කරන ලද එකම සරල වස්තුව මෙන්න:

angular.module('app', [])
  .service('helloService', function() {
    this.sayHello = function() {
      return "Hello!";
    }
  })
  .factory('helloFactory', function() {
    return {
      sayHello: function() {
        return "Hello!";
      }
    }
  });

2
විශිෂ්ට පැහැදිලි කිරීමක්, ස්තූතියි! කර්මාන්තශාලා නියැදි කේතයේ Authorඉන්ජෙක්ටර් පරාමිතිය තිබිය යුතු වර්ගයක් ද ඇත Person.
mikhail-t

ස්තූතියි ik mik-T, මම යතුරු ලියනය නිවැරදි කළා.
superluminary

1
ඔබ සේවා රටාව භාවිතා කිරීම වැරදියි - මෙය කර්මාන්ත ශාලාවක් විය යුතුය. .Service () වෙනුවට .factory () අමතන්නේ නම් එය හරියටම ක්‍රියාත්මක වන බව ඔබට පෙනෙනු ඇත. සේවා රටාව යන්නෙන් අදහස් කරන්නේ නව වස්තුවක් ලබා දෙන ශ්‍රිතයක් නොව, ඉදිකිරීම් ශ්‍රිතයක් සැපයීමයි. ඔබේ ඉදිකිරීම්කරුගේ ක්‍රියාකාරිත්වය මත කෝණික (effectively ලදායී) "නව" යනුවෙන් හැඳින්වේ. ඔබේ සේවාව ක්‍රියාත්මක වීමට ඇති එකම හේතුව නම්, ඔබ වස්තුවක් ආපසු ලබා දෙන ඉදිකිරීම් ශ්‍රිතයක් සඳහා “නව” යැයි අමතන්නේ නම්, ඔබ සැබවින්ම ගොඩනඟන ලද වස්තුවට වඩා ආපසු ලබා දුන් වස්තුව ආපසු ලබා ගැනීමයි. ආකෘති පමණක් නොව ඔබට අවශ්‍ය ඕනෑම දෙයක් නිර්මාණය කිරීමට කර්මාන්තශාලා භාවිතා කළ හැකිය.
ඩෑන් කිං

27

මෙහි ඇති සියලුම පිළිතුරු සේවා හා කර්මාන්තශාලා වටා ඇති බව පෙනේ. එය වලංගු වන්නේ එය විමසනු ලැබූ බැවිනි. නමුත් එය ඇතුළු අන් අය සිටින බව මතක තබා ගත යුතු වැදගත් ද වේ provider(), value()සහ constant().

මතක තබා ගත යුතු ප්‍රධාන දෙය නම්, සෑම එකක්ම අනෙකාගේ විශේෂ අවස්ථාවකි. සෑම විශේෂ අවස්ථාවක්ම අඩු කේතයකින් එකම දේ කිරීමට ඔබට ඉඩ සලසයි. සෑම කෙනෙකුම අමතර සීමාවන් ඇත.

අඩු කේතයකින් ඔබට අවශ්‍ය දේ කිරීමට ඉඩ දෙන්නේ කුමන එකක් දැයි ඔබ දකින විට භාවිතා කළ යුත්තේ කවදාද යන්න තීරණය කිරීම. මෙන්න ඔවුන් කෙතරම් සමානද යන්න නිරූපණය කරන රූපයක්:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

පියවරෙන් පියවර බිඳවැටීම සහ ඒවා භාවිතා කළ යුත්තේ කවදාද යන්න පිළිබඳ ඉක්මන් යොමු කිරීමක් සඳහා ඔබට මෙම පින්තූරය ලබා ගත් බ්ලොග් සටහනට පිවිසිය හැකිය:

http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/


3
@jacob සමහර විට එසේ විය හැකිය, නමුත් මම සිතන්නේ ඒවා භාවිතා කළ යුත්තේ කවදාද යන්න පිළිබඳ සමස්ත සංකල්පය පමණක් නොව, ඒවා සියල්ලම එකම දේවල අත්‍යවශ්‍යයෙන්ම වෙනස් වන බවයි.
ලුයිස් පෙරෙස්

1
@LuisPerez ඔබේ බ්ලොග් අඩවියට සහ එහි වෙනස පැහැදිලි කරන වීඩියෝ පටයට ඇති සබැඳිය ඇත්තෙන්ම විශිෂ්ටයි. වීඩියෝවෙන් එම උදාහරණ සමඟ තේරුම් ගැනීම පහසුය :)
Alin Ciocan

24

app.factory ('fn', fn) එදිරිව app.service ('fn', fn)

ඉදිකිරීම

කර්මාන්තශාලා සමඟ, කෝණික ප්‍රති the ලය ලබා ගැනීම සඳහා ශ්‍රිතය කැඳවනු ඇත. එය හැඹිලි හා එන්නත් කරන ලද ප්‍රති result ලයයි.

 //factory
 var obj = fn();
 return obj;

සේවාවන් සමඟ, කෝණික මඟින් නව ඇමතුම් ලබා දීමෙන් ඉදිකිරීම්කරුගේ ක්‍රියාකාරිත්වය ක්‍රියාත්මක වේ. ඉදිකරන ලද කාර්යය හැඹිලි සහ එන්නත් කරනු ලැබේ.

  //service
  var obj = new fn();
  return obj;

ක්‍රියාත්මක කිරීම

නැවත අගය නිසා කර්මාන්ත ශාලා සාමාන්යයෙන් වස්තුව ප්රායෝගික නැවත වේ පාලකයන්, ලකුණු කුට්ටි, මඟ පෙන්වීම්, ආදිය ශරීරගත දේ

  app.factory('fn', function(){
         var foo = 0;
         var bar = 0;
         function setFoo(val) {
               foo = val;
         }
         function setBar (val){
               bar = val;
         }
         return {
                setFoo: setFoo,
                serBar: setBar
         }
  });

සේවා කාර්යයන් සාමාන්‍යයෙන් කිසිවක් ආපසු ලබා නොදේ. ඒ වෙනුවට, ඔවුන් ආරම්භක කටයුතු සිදු කරන අතර කාර්යයන් නිරාවරණය කරයි. 'නව' භාවිතයෙන් ඉදිකරන ලද බැවින් කාර්යයන් සඳහා 'මෙය' සඳහන් කළ හැකිය.

app.service('fn', function () {
         var foo = 0;
         var bar = 0;
         this.setFoo = function (val) {
               foo = val;
         }
         this.setBar = function (val){
               bar = val;
         }
});

නිගමනය

කර්මාන්තශාලා හෝ සේවා භාවිතා කිරීමේදී ඒවා දෙකම බෙහෙවින් සමාන ය. ඒවා පාලකයන්, විධානයන්, ධාවන වාරණ යනාදිය තුළට එන්නත් කර ඇති අතර සේවාදායක කේතයේ එකම ආකාරයකින් භාවිතා කරයි. ඒවා දෙකම තනි බොත්තම් වේ - මෙයින් අදහස් කරන්නේ සේවාව / කර්මාන්තශාලාව එන්නත් කරන සියලුම ස්ථාන අතර එකම අවස්ථාව බෙදා ගන්නා බවයි.

ඉතින් ඔබ කැමති කුමන දෙයටද? එක්කෝ එකක් - ඒවා කොතරම් සමානද යත් වෙනස්කම් සුළුපටු නොවේ. ඔබ එකකට වඩා එකක් තෝරා ගන්නේ නම්, ඒවා ඉදිකර ඇති ආකාරය ගැන සැලකිලිමත් වන්න, එවිට ඔබට ඒවා නිසි ලෙස ක්‍රියාත්මක කළ හැකිය.


සේවා කාර්යයන් "කිසිවක් ආපසු නොදෙනු ඇත", ඔබ විසින්ම ආපසු ලබා දෙන ප්‍රකාශය සඳහන් නොකරන්නේ නම් ඒවා ව්‍යංගයෙන් ආපසු ලබා දෙනු ලැබේ (අවසාන අවස්ථාවේදී ඔබ ආපසු පැමිණි වස්තුව කර්මාන්ත ශාලාවකට සමානව නිර්මාණය කර හැඹිලි කරනු ලැබේ).
ක්‍රිප්ටෝ වයිරස්

මම හිතන්නේ ඔබ එය වැරදියට අර්ථකථනය කරනවා ... මම ආපසු එන විට, මම අදහස් කළේ සේවා ක්‍රියාකාරිත්වය ක්‍රියාත්මක කිරීමේ
දෘෂ්ටි කෝණයෙන්

කර්මාන්ත ශාලාවද තනි නගරයක් බව ඔබට විශ්වාසද?
අඟහරු 2049

5

වෙනස හඳුනා ගැනීමට මම කාලයක් ගත කර ඇත්තෙමි.

මම හිතන්නේ කර්මාන්තශාලා ශ්‍රිතය මොඩියුල රටාව භාවිතා කරන අතර සේවා ශ්‍රිතය සම්මත ජාවා ස්ක්‍රිප්ට් ඉදිකිරීම් රටාව භාවිතා කරයි.


2

කර්මාන්තශාලා රටාව වඩාත් නම්‍යශීලී වන්නේ එයට කාර්යයන් සහ අගයන් මෙන්ම වස්තූන් ද ආපසු ලබා දිය හැකි බැවිනි.

සේවා රටාවේ IMHO හි බොහෝ කරුණු නොමැත, එය කරන සෑම දෙයක්ම ඔබට කර්මාන්ත ශාලාවක් සමඟ පහසුවෙන් කළ හැකිය. ව්යතිරේක විය හැකිය:

  • කිසියම් හේතුවක් නිසා ඔබේ ක්ෂණික සේවයේ ප්‍රකාශිත වර්ගය ගැන ඔබ සැලකිලිමත් වන්නේ නම් - ඔබ සේවා රටාව භාවිතා කරන්නේ නම්, ඔබේ ඉදිකිරීම්කරු නව සේවාවේ වර්ගය වනු ඇත.
  • ඔබ දැනටමත් වෙනත් තැනක භාවිතා කරන ඉදිකිරීම් ශ්‍රිතයක් තිබේ නම් ඔබටද සේවාවක් ලෙස භාවිතා කිරීමට අවශ්‍යය (ඔබට යමක් එන්නත් කිරීමට අවශ්‍ය නම් බොහෝ විට එය භාවිතා නොකෙරේ!).

සේවා රටාව a සින්ටැක්ස් දෘෂ්ටි කෝණයකින් නව වස්තුවක් නිර්මාණය කිරීම සඳහා තරමක් හොඳ ක්‍රමයක් බව තර්ක කළ හැකි නමුත් එය ක්ෂණිකව ක්‍රියාත්මක කිරීම වඩා මිල අධිකය. සේවාව නිර්මාණය කිරීම සඳහා කෝණික "නව" භාවිතා කරන බව තවත් සමහරු පෙන්වා දී ඇත, නමුත් මෙය සත්‍යයක් නොවේ - සෑම සේවා ඉදිකිරීම්කරුවෙකුටම වෙනස් පරාමිති සංඛ්‍යාවක් ඇති බැවින් එය කළ නොහැක. ඇත්ත වශයෙන්ම කෝණික වන්නේ කර්මාන්තශාලා රටාව අභ්‍යන්තරව ඔබේ ඉදිකිරීම්කරුගේ ක්‍රියාකාරිත්වය ඔතා ගැනීමයි. එවිට එය ජාවාස්ක්‍රිප්ට් හි “නව” ක්‍රියාකරු අනුකරණය කිරීම සඳහා විචක්ෂණශීලී ජිජරි පෝකරි යන්ත්‍රයක් සිදු කරයි , ඔබේ ඉදිකිරීම්කරුට විචල්‍ය එන්නත් කළ හැකි තර්ක ගණනක් ඉදිරිපත් කරයි - නමුත් ඔබ කර්මාන්තශාලා රටාව කෙලින්ම භාවිතා කරන්නේ නම් ඔබට මෙම පියවරෙන් ඉවත් විය හැකිය, එමඟින් ඔබේ කාර්යක්ෂමතාව තරමක් වැඩි කරයි කේතය.


කර්මාන්තශාලා සාපේක්ෂව මිල අධික වසා දැමීම් භාවිතා කරන බැවින් සේවා කර්මාන්තශාලාවලට වඩා ඉදිකිරීමට වඩා කාර්යක්ෂම වේ.
ජාකොබ්

වසා දැමීම ගැන ඔබ අදහස් කරන්නේ කුමක්දැයි විශ්වාස නැද්ද? කර්මාන්තශාලාව යනු වස්තුවක් ආපසු ලබා දෙන ශ්‍රිතයක් පමණි. ඔබ වසා දැමීමක් භාවිතා කළ යුත්තේ ඔබ ආපසු ලබා දුන් වස්තුවට "පුද්ගලික" තත්වයක් අවශ්‍ය නම් පමණි. ඔබ ඉදිකිරීම්කරුවෙකු (සේවාවක්) භාවිතා කළේ නම් ඔබට තවමත් ඒ දේම කිරීමට සිදුවේ. මම මූලාකෘති ගැන ඔබේ අදහස ගන්නවා - ඔබට අවශ්‍ය නම් කර්මාන්ත ශාලාවක මෙය කළ හැකි වුවද .
ඩෑන් කිං

function MyFactory(dep1) { var $$foo = 'bar', factory = {}; Object.defineProperties(factory.prototype, { foo: { value: $$foo } }); return factory; } function MyService(dep1) { var $$foo = 'bar'; Object.defineProperties(MyService.prototype, { foo: { value: $$foo } }); } MyFactory සහ MyService යන දෙකම මූලාකෘති භාවිතා කරන අතරම, MyFactory තවමත් ආපසු ලබා දෙන වස්තුව තැනීම සඳහා කාර්ය සාධන පහරක් ගනී. මෙම උදාහරණ දෙකෙහිම, ඔවුන්ට පෞද්ගලිකත්වයන් ඇත, නමුත් MyService හි සාපේක්ෂව කාර්ය සාධන වෙනසක් නොමැත.
ජාකොබ්

1
මට නම් වෙනස වන්නේ ක්‍රමවේදයක් නොමැතිව කර්මාන්ත ශාලාව කෙලින්ම භාවිතා කිරීමට මට අවශ්‍යද යන්නයි: MyFactory(someArgument)(උදා $http()). ඔබ ඉදිකිරීම්කරු ගැන සඳහන් කරන බැවින් සේවාවක් සමඟ එය කළ නොහැක : MyService(someArgument).
ජාකොබ්

වස්තු ඉදිකිරීමේ වේලාවේදී, කර්මාන්තශාලාව = {a කාර්ය සාධනයට පහර දෙන්නේ කෙසේදැයි මම නොදනිමි, එය ඔබේ ඉදිකිරීම්කරු අමතන විට ජාවාස්ක්‍රිප්ට් ඔබ වෙනුවෙන් "මෙය" ආරම්භ කිරීමට වඩා වැඩි ද? ඔබේ ඉදිකිරීම්කරු කර්මාන්ත ශාලාවක ඔතාගෙන යන විට කෝණික පැත්තට වඩා විශාල කාර්ය සාධනයක් ඇති බව මම සිතමි. ඉන්පසු ඔබේ නව පරායත්තතාවයන් එන්නත් කළ හැකි වන පරිදි “නව” අනුකරනය කිරීම සඳහා වළලු හරහා පැනිය යුතුය.
ඩෑන් කිං
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.