Seperti yang saya pahami, ketika di dalam pabrik saya mengembalikan objek yang akan disuntikkan ke controller. Ketika di dalam layanan saya berurusan dengan objek menggunakan this
dan tidak mengembalikan apa pun.
Saya berada di bawah asumsi bahwa layanan selalu singleton , dan bahwa objek pabrik baru akan disuntikkan di setiap pengontrol. Namun, ternyata, objek pabrik juga singleton?
Contoh kode untuk diperagakan:
var factories = angular.module('app.factories', []);
var app = angular.module('app', ['ngResource', 'app.factories']);
factories.factory('User', function () {
return {
first: 'John',
last: 'Doe'
};
});
app.controller('ACtrl', function($scope, User) {
$scope.user = User;
});
app.controller('BCtrl', function($scope, User) {
$scope.user = User;
});
Ketika mengubah user.first
dalam ACtrl
ternyata user.first
di BCtrl
juga berubah, misalnya User
adalah tunggal?
Asumsi saya adalah bahwa instance baru disuntikkan ke controller dengan pabrik?
Jawaban:
Semua layanan sudut adalah lajang :
Documents (lihat Layanan sebagai lajang ): https://docs.angularjs.org/guide/services
Pada dasarnya perbedaan antara layanan dan pabrik adalah sebagai berikut:
Lihat presentasi ini tentang $ berikan: http://slides.wesalvaro.com/20121113/#/
Slide tersebut digunakan di salah satu pertemuan AngularJs: http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html
sumber
new
.Bagi saya wahyu datang ketika saya menyadari bahwa mereka semua bekerja dengan cara yang sama: dengan menjalankan sesuatu sekali , menyimpan nilai yang mereka dapatkan, dan kemudian batuk nilai tersimpan yang sama ketika dirujuk melalui Dependency Injection.
Katakanlah kita memiliki:
Perbedaan antara ketiganya adalah:
a
Nilai yang disimpan berasal dari menjalankanfn
, dengan kata lain:fn()
b
Nilai yang disimpan berasal darinew
ingfn
, dengan kata lain:new fn()
c
Nilai yang disimpan berasal dari pertama mendapatkan instance dengannew
ingfn
, dan kemudian menjalankan$get
metode instanceyang berarti, ada sesuatu seperti objek cache di dalam angular, yang nilainya setiap injeksi hanya diberikan satu kali, ketika mereka telah disuntikkan pertama kali, dan di mana:
Inilah sebabnya kami menggunakan
this
dalam layanan, dan mendefinisikanthis.$get
penyedia dalam.Semoga ini membantu.
sumber
contoh hidup
Contoh "halo dunia"
dengan
factory
/service
/provider
:sumber
Ada juga cara untuk mengembalikan fungsi konstruktor sehingga Anda dapat kembali newable kelas di pabrik-pabrik, seperti ini:
Jadi Anda bisa melakukan ini di controller, yang menggunakan MyObjectWithParam:
Lihat di sini contoh lengkapnya:
http://plnkr.co/edit/GKnhIN?p=preview
Dan di sini halaman grup Google, di mana dibahas:
https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ
sumber
App.factory('MyObjectWithParam', ['$injector', function ($injector) { return function(name) { return $injector.instantiate(MyObjectWithParam,{ name: name }); }; }]);
Baca lebih lanjut di sini: docs.angularjs.org/tutorial/step_05.service
?.factory
bertentangan.service
?new Car('BMW')
dannew Car('Ford')
dan mereka tidak berbagi variabel dan segalanya yang sama.Inilah perbedaan utamanya:
Jasa
Sintaksis:
module.service( 'serviceName', function );
Hasil: Saat mendeklarasikan serviceName sebagai argumen yang dapat disuntikkan, Anda akan diberikan instance fungsi yang diteruskan ke
module.service
.Penggunaan: Dapat bermanfaat untuk berbagi fungsi utilitas yang berguna untuk dipanggil hanya dengan menambahkan () ke referensi fungsi yang disuntikkan. Bisa juga dijalankan dengan
injectedArg.call( this )
atau serupa.Pabrik
Sintaksis:
module.factory( 'factoryName', function );
Hasil: Saat mendeklarasikan factoryName sebagai argumen injeksi, Anda akan diberikan nilai yang dikembalikan dengan memohon referensi fungsi yang diteruskan ke
module.factory
.Penggunaan: Dapat berguna untuk mengembalikan fungsi 'kelas' yang kemudian dapat digunakan untuk membuat instance.
Juga periksa dokumentasi AngularJS dan pertanyaan serupa tentang stackoverflow bingung tentang layanan vs pabrik .
Berikut ini adalah contoh menggunakan layanan dan pabrik . Baca lebih lanjut tentang layanan AngularJS vs pabrik .
sumber
Menambah jawaban pertama, saya pikir .service () adalah untuk orang-orang yang telah menulis kode mereka dalam gaya yang lebih berorientasi objek (C # / Java) (menggunakan kata kunci ini dan objek instantiating melalui fungsi prototipe / Konstruktor).
Factory adalah untuk pengembang yang menulis kode yang lebih alami untuk javascript / gaya fungsional pengkodean.
Lihatlah kode sumber metode .service dan .factory di dalam angular.js - secara internal mereka semua memanggil metode penyedia:
sumber
Sangat sederhana:
.service - fungsi terdaftar akan dipanggil sebagai konstruktor (alias 'baru')
.factory - fungsi terdaftar akan dipanggil sebagai fungsi sederhana
Keduanya dipanggil sekali sehingga menghasilkan objek tunggal yang akan disuntikkan ke komponen lain dari aplikasi Anda.
sumber
Semua penyedia bekerja dengan cara yang sama. Metode yang berbeda
service
,factory
,provider
hanya membiarkan Anda mencapai hal yang sama dalam kode kurang.PS Ada juga
value
danconstant
.Setiap kasus khusus di rantai mulai dengan
provider
dan berakhir denganvalue
memiliki batasan tambahan. Jadi untuk memutuskan di antara mereka, Anda harus bertanya pada diri sendiri yang mana Anda dapat mencapai apa yang Anda inginkan dengan kode lebih sedikit.Ini adalah gambar yang menunjukkan apa yang saya maksud:
Anda dapat rincian dan referensi panduan di posting blog saya mendapatkan gambar ini dari:
http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
sumber
console.log()
dan menyuntikkan ke beberapa pengendali.Berikut adalah beberapa contoh layanan vs pabrik yang mungkin berguna dalam melihat perbedaan di antara mereka. Pada dasarnya, sebuah layanan memiliki "baru ..." yang dipanggil, itu sudah dipakai. Sebuah pabrik tidak secara instantiated secara otomatis.
Contoh dasar
Mengembalikan objek kelas yang memiliki metode tunggal
Berikut adalah layanan yang memiliki satu metode:
Berikut adalah pabrik yang mengembalikan objek dengan metode:
Kembalikan nilai
Pabrik yang mengembalikan daftar angka:
Layanan yang mengembalikan daftar angka:
Output dalam kedua kasus adalah sama, daftar angka.
Contoh lanjutan
Variabel "Kelas" menggunakan pabrik
Dalam contoh ini kita mendefinisikan CounterFactory, itu menambah atau mengurangi counter dan Anda bisa mendapatkan jumlah saat ini atau mendapatkan berapa banyak objek CounterFactory telah dibuat:
Kami menggunakan
CounterFactory
untuk membuat banyak penghitung. Kita dapat mengakses variabel kelas untuk melihat berapa banyak penghitung yang dibuat:Output dari kode ini adalah:
sumber
"Pabrik" dan "Layanan" adalah berbagai cara melakukan DI (Dependency injection) dalam sudut.
Jadi ketika kita mendefinisikan DI menggunakan "layanan" seperti yang ditunjukkan pada kode di bawah ini. Ini menciptakan instance GLOBAL baru dari objek "Logger" dan menyuntikkannya ke fungsi.
Ketika Anda mendefinisikan DI menggunakan "pabrik" itu tidak membuat instance. Itu hanya melewati metode dan kemudian konsumen secara internal harus membuat panggilan ke pabrik untuk contoh objek.
Di bawah ini adalah gambar sederhana yang menunjukkan secara visual bagaimana proses DI untuk "Layanan" berbeda dari "Pabrik".
Pabrik harus digunakan Ketika kita ingin membuat berbagai jenis objek tergantung pada skenario. Misalnya tergantung pada skenario kami ingin membuat objek "Pelanggan" sederhana, atau "Pelanggan" dengan objek "Alamat" atau "Pelanggan" dengan objek "Telepon". Berikut ini penjelasan terperinci dari paragraf ini
Layanan harus digunakan Ketika kita memiliki utilitas atau fungsi bersama yang akan disuntikkan seperti Utilitas, Logger, Penangan kesalahan dll.
sumber
Gaya layanan : ( mungkin yang paling sederhana ) mengembalikan fungsi sebenarnya: Berguna untuk berbagi fungsi utilitas yang berguna untuk dipanggil hanya dengan menambahkan () ke referensi fungsi yang disuntikkan.
Layanan di AngularJS adalah objek JavaScript tunggal yang berisi serangkaian fungsi
Gaya pabrik : ( lebih terlibat tetapi lebih canggih ) mengembalikan nilai pengembalian fungsi: instantiate objek seperti Object baru () di java.
Pabrik adalah fungsi yang menciptakan nilai. Ketika suatu layanan, pengontrol, dll. Membutuhkan suatu nilai yang disuntikkan dari suatu pabrik, pabrik tersebut menciptakan nilai berdasarkan permintaan. Setelah dibuat, nilai tersebut digunakan kembali untuk semua layanan, pengontrol, dll. Yang perlu disuntikkan.
Gaya penyedia : ( versi penuh, dapat dikonfigurasi ) mengembalikan output dari fungsi $ get fungsi: Dapat dikonfigurasi.
Penyedia di AngularJS adalah bentuk pabrik paling fleksibel yang dapat Anda buat. Anda mendaftarkan penyedia dengan modul seperti yang Anda lakukan dengan layanan atau pabrik, kecuali Anda menggunakan fungsi provider ().
src jenkov
jsbin
jsfiddle
sumber
Perbedaan mendasar, adalah bahwa penyedia memungkinkan untuk menetapkan nilai-nilai fungsi primitif (non-objek), array, atau panggilan balik ke dalam variabel yang dinyatakan pabrik, dan dengan demikian jika mengembalikan objek itu harus dinyatakan dan dikembalikan secara eksplisit.
Di sisi lain, layanan hanya dapat digunakan untuk mengatur variabel yang dinyatakan layanan ke objek, sehingga kami dapat menghindari pembuatan eksplisit dan pengembalian objek, sementara di sisi lain ia memungkinkan penggunaan kata kunci ini .
Atau dengan kata singkat " penyedia adalah bentuk yang lebih umum sementara layanan terbatas pada objek saja".
sumber
Inilah bagaimana saya memahami perbedaan di antara mereka dalam hal pola desain:
Layanan : Mengembalikan suatu jenis, yang akan diberitakan baru untuk membuat objek jenis itu. Jika analogi Java digunakan, Layanan mengembalikan definisi Kelas Java .
Pabrik : Mengembalikan benda konkret yang dapat segera digunakan. Dalam Java Analogy, Factory mengembalikan Object Java .
Bagian yang sering membingungkan orang (termasuk saya) adalah bahwa ketika Anda menyuntikkan Layanan atau Pabrik dalam kode Anda, mereka dapat digunakan dengan cara yang sama, apa yang Anda dapatkan dalam kode Anda dalam kedua kasus adalah objek konkret yang dapat segera Anda panggil. Yang berarti dalam hal Layanan, panggilan sudut "baru" pada deklarasi layanan atas nama Anda. Saya pikir ini adalah konsep yang berbelit-belit.
sumber
Ini akan menjadi jawaban terbaik dan singkat untuk memahami Service Vs Factory Vs Provider
Sumber : https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J
Inilah yang dikatakan ben dengan demo http://jsbin.com/ohamub/1/edit?html,output
"Ada komentar dalam kode yang mengilustrasikan perbedaan utama tetapi saya akan sedikit memperluasnya di sini. Sebagai catatan, saya hanya memikirkan hal ini jadi jika saya mengatakan sesuatu yang salah, tolong beri tahu saya.
Jasa
Sintaks : module.service ('serviceName', function);
Hasil : Saat mendeklarasikan serviceName sebagai argumen injeksi, Anda akan diberikan referensi fungsi aktual yang diteruskan ke module.service.
Penggunaan : Dapat bermanfaat untuk berbagi fungsi utilitas yang berguna untuk dipanggil hanya dengan menambahkan () ke referensi fungsi yang disuntikkan. Bisa juga dijalankan dengan injectedArg.call (ini) atau yang serupa.
Pabrik
Sintaks : module.factory ('factoryName', fungsi);
Hasil : Saat mendeklarasikan factoryName sebagai argumen injeksi, Anda akan diberikan nilai yang dikembalikan dengan memohon referensi fungsi yang diteruskan ke module.factory.
Penggunaan : Dapat berguna untuk mengembalikan fungsi 'kelas' yang kemudian dapat digunakan untuk membuat instance.
Penyedia
Sintaks : module.provider ('providerName', function);
Hasil : Ketika mendeklarasikan providerName sebagai argumen injeksi, Anda akan diberikan nilai yang dikembalikan dengan memanggil metode $ get dari referensi fungsi yang diteruskan ke module.provider.
Penggunaan : Dapat berguna untuk mengembalikan fungsi 'kelas' yang kemudian dapat baru untuk membuat instance tetapi yang membutuhkan semacam konfigurasi sebelum disuntikkan. Mungkin berguna untuk kelas yang dapat digunakan kembali di seluruh proyek? Masih agak kabur untuk yang satu ini. "Ben
sumber
Saya memiliki kebingungan ini untuk sementara waktu dan saya mencoba yang terbaik untuk memberikan penjelasan sederhana di sini. Semoga ini bisa membantu!
angular .factory
danangular .service
keduanya digunakan untuk menginisialisasi layanan dan bekerja dengan cara yang sama.Satu-satunya perbedaan adalah, bagaimana Anda ingin menginisialisasi layanan Anda.
Keduanya lajang
Pabrik
app.factory (
<service name>
,<function with a return value>
)Jika Anda ingin menginisialisasi layanan Anda dari fungsi yang Anda miliki dengan nilai kembali , Anda harus menggunakan
factory
metode ini .misalnya
Saat menyuntikkan layanan ini (misalnya ke controller Anda):
myService()
) untuk mengembalikan objekLayanan
app.service (
<service name>
,<constructor function>
)Jika Anda ingin menginisialisasi layanan Anda dari fungsi konstruktor (menggunakan
this
kata kunci), Anda harus menggunakanservice
metode ini .misalnya
Saat menyuntikkan layanan ini (misalnya ke controller Anda):
new
fungsi yang Anda berikan (asnew myService()
) untuk mengembalikan objekCATATAN: Jika Anda menggunakan
factory
dengan<constructor function>
atauservice
dengan<function with a return value>
, itu tidak akan berfungsi.Contoh - DEMO
sumber
Inilah yang membantu saya memahami perbedaannya, berkat posting blog oleh Pascal Precht.
Layanan adalah metode pada modul yang mengambil nama dan fungsi yang mendefinisikan layanan. Anda dapat menyuntikkan dan menggunakan layanan khusus itu di komponen lain, seperti pengontrol, arahan dan filter. Pabrik adalah metode pada modul dan juga membutuhkan nama dan fungsi, yang mendefinisikan pabrik. Kami juga dapat menyuntikkan dan menggunakannya dengan cara yang sama kami lakukan dengan layanan.
Objek yang dibuat dengan menggunakan nilai properti prototipe dari fungsi konstruktor mereka sebagai prototipe mereka, jadi saya menemukan kode Angular yang memanggil Object.create (), yang saya percaya adalah fungsi konstruktor layanan ketika akan dipakai. Namun, fungsi pabrik sebenarnya hanya fungsi yang dipanggil, itulah sebabnya kita harus mengembalikan objek literal untuk pabrik.
Berikut adalah kode sudut 1,5 yang saya temukan untuk pabrik:
Cuplikan kode sumber sudut untuk fungsi factory ():
Dibutuhkan nama dan fungsi pabrik yang dilewati dan mengembalikan penyedia dengan nama yang sama, yang memiliki metode $ get yang merupakan fungsi pabrik kami. Setiap kali Anda meminta injector untuk ketergantungan tertentu, ia pada dasarnya meminta penyedia terkait untuk sebuah instance dari layanan itu, dengan memanggil metode $ get (). Karena itulah diperlukan $ get () saat membuat penyedia.
Berikut adalah kode 1,5 sudut untuk layanan.
Ternyata ketika kita memanggil service (), sebenarnya memanggil factory ()! Namun, tidak hanya meneruskan fungsi konstruktor layanan kami ke pabrik apa adanya. Itu juga melewati fungsi yang meminta injektor untuk instantiate objek oleh konstruktor yang diberikan.
Dengan kata lain, jika kita menyuntikkan MyService di suatu tempat, yang terjadi dalam kode adalah:
Untuk menyatakannya kembali, sebuah layanan memanggil sebuah pabrik, yang merupakan metode $ get () pada penyedia terkait. Selain itu, $ injector.instantiate () adalah metode yang akhirnya memanggil Object.create () dengan fungsi konstruktor. Itu sebabnya kami menggunakan "ini" dalam layanan.
Untuk ES5 tidak masalah yang kami gunakan: service () atau factory (), itu selalu merupakan pabrik yang disebut yang menciptakan penyedia untuk layanan kami.
Anda dapat melakukan hal yang sama persis dengan layanan juga. Layanan adalah fungsi konstruktor, namun, itu tidak mencegah kita mengembalikan objek literal. Jadi kita dapat mengambil kode layanan kami dan menuliskannya dengan cara yang pada dasarnya melakukan hal yang sama persis seperti pabrik kami atau dengan kata lain, Anda dapat menulis layanan sebagai pabrik untuk mengembalikan objek.
Mengapa kebanyakan orang merekomendasikan untuk menggunakan pabrik di atas layanan? Ini adalah jawaban terbaik yang pernah saya lihat yang berasal dari buku Pawel Kozlowski: Menguasai Pengembangan Aplikasi Web dengan AngularJS.
sumber
this
kata kunci untuk mendefinisikan fungsi.$get
Anda mendefinisikan dan dapat digunakan untuk mendapatkan objek yang mengembalikan data.sumber
Ada tiga cara menangani logika bisnis di AngularJS: ( Terinspirasi oleh kursus Coursera AngularJS Yaakov ) yaitu:
Di sini kita hanya akan berbicara tentang Service vs Factory
LAYANAN :
Sintaksis:
app.js
index.html
Fitur utama Layanan:
Lazily Instantiated : Jika layanan ini tidak disuntikkan, itu tidak akan pernah instantiated. Jadi untuk menggunakannya Anda harus menyuntikkannya ke modul.
Singleton : Jika disuntikkan ke beberapa modul, semua akan memiliki akses hanya ke satu instance tertentu. Itu sebabnya, sangat nyaman untuk berbagi data di seluruh pengontrol yang berbeda.
PABRIK
Sekarang mari kita bicara tentang Factory in AngularJS
Pertama mari kita lihat sintaks :
app.js :
Sekarang menggunakan dua di atas di controller:
Fitur pabrik:
Jenis layanan ini mengikuti pola desain pabrik . Pabrik dapat dianggap sebagai tempat sentral yang menciptakan objek atau metode baru.
Ini tidak hanya menghasilkan singleton, tetapi juga layanan yang dapat disesuaikan.
The
.service()
Metode adalah pabrik yang selalu menghasilkan jenis yang sama dari layanan, yang merupakan tunggal. Tidak ada cara mudah untuk mengkonfigurasi perilaku itu. Itu.service()
metode biasanya digunakan sebagai jalan pintas untuk sesuatu yang tidak memerlukan apapun konfigurasi.sumber
Untuk penjelasan singkat dan sederhana, lihat https://stackoverflow.com/a/26924234/5811973 .
Untuk penjelasan terperinci, lihat https://stackoverflow.com/a/15666049/5811973 .
Juga dari dokumentasi angularJs:
sumber
Anda dapat memahami perbedaannya dengan analogi ini - Pertimbangkan perbedaan antara fungsi normal yang akan mengembalikan beberapa nilai dan fungsi konstruktor yang akan dipakai di awal menggunakan kata kunci baru. sebuah objek) sedangkan menciptakan layanan seperti menciptakan fungsi konstruktor (kelas OO) yang kita dapat membuat contoh menggunakan kata kunci baru. Satu-satunya hal yang perlu diperhatikan adalah di sini adalah bahwa ketika kita menggunakan metode Layanan untuk membuat layanan, itu akan secara otomatis membuat contohnya menggunakan mekanisme injeksi ketergantungan yang didukung oleh AngularJS
sumber