Apakah benar untuk meneruskan "arus" $scope
ke layanan AngularJS?
Saya berada dalam situasi di mana saya memiliki $ service karena mengetahui itu dikonsumsi hanya oleh satu pengontrol, dan saya ingin memiliki referensi ke ruang lingkup pengontrol dalam metode $ service itu sendiri.
Apakah ini benar secara filosofis ?
Atau lebih baik saya menyiarkan acara ke $ rootScope dan kemudian membuat pengontrol saya mendengarkannya?
$scope
properti dan menelepon$scope.$apply
saat diperlukan.$scope
... bagaimana pengontrol langsung mengakses data dalam layanan dan meneruskannya ke tampilan tanpa melakukan ini?Jawaban:
Untuk memberi tahu pengontrol saat terjadi asinkronisasi, gunakan janji Angular .
Untuk memprovokasi
$apply
, Anda tidak memerlukan scope, Anda bisa memanggil$rootScope.$apply
, karena tidak ada perbedaan memanggilnya dalam lingkup tertentu atau di root.Mengenai pembacaan variabel, akan lebih baik jika Anda menerima parameter. Tetapi Anda juga dapat membacanya dari ruang lingkup sebagai parameter objek, tetapi saya akan menggunakan parameter, yang akan membuat antarmuka layanan Anda jauh lebih jelas.
sumber
$scope
melalui panggilan ke layanan menggunakanexecuteSql()
fungsi async . Melihat ke 3 opsi (1) gunakan callback pada fungsi async, lalu panggil$scope.$apply
... ini berfungsi, tetapi jelek (2) teruskan$scope
ke fungsi asinkron, lalu panggiltheScope.$apply()
... ini juga berfungsi (3) gunakan janji. ..belum mencoba ini. Mengapa janji adalah cara terbaik? Terima kasih!Saya akan mengatakan jika fungsionalitas Anda khusus untuk satu pengontrol saja daripada Anda tidak memerlukan layanan.
Tugas pengontrol adalah memanipulasi model tertentu sedangkan layanan harus menangani tugas global. Saya lebih suka berpegang pada paradigma ini daripada mencampurkan semuanya.
Ini yang dikatakan dokumen
Layanan
Kontroler
PS: Selain itu jika Anda perlu mencerna, Anda juga dapat menyuntikkan $ rootScope dalam layanan Anda.
sumber
$apply
atau$digest
ke $ rootScope sangat masuk akal bagi saya.Iya. Anda bisa meneruskan $ scope ke layanan saat Anda menginisialisasinya. Dalam konstruktor layanan, Anda dapat menetapkan cakupan ke sesuatu seperti this._scope dan kemudian mereferensikan cakupan dalam layanan!
sumber
$scope
yang diberikan menginjeksi layanan - sehingga tidak perlu memanggil metode pada layanan dan meneruskannya secara manual$scope
.new MyFunction()
). Pertanyaannya adalah tentang layanan, di mana meneleponnew
bukanlah suatu pilihan.Saya pribadi percaya bahwa meneruskan
$scope
layanan adalah ide yang buruk , karena ini menciptakan referensi melingkar: pengontrol bergantung pada layanan dan layanan bergantung pada cakupan pengontrol.Selain membingungkan dalam hal hubungan, hal-hal seperti ini akhirnya menghalangi pengumpul sampah.
Pendekatan yang saya sukai adalah meletakkan objek domain dalam lingkup pengontrol dan meneruskannya ke layanan. Dengan cara ini layanan berfungsi terlepas apakah itu digunakan di dalam pengontrol atau mungkin di dalam layanan lain di masa mendatang.
Misalnya, jika layanan seharusnya mendorong dan memunculkan elemen dari array
errors
, kode saya adalah:Layanan kemudian berinteraksi dengan pengontrol dengan mengoperasikannya
errors
. Tentu saja saya harus berhati-hati untuk tidak pernah menghapus seluruh referensi array, tetapi pada akhirnya itu adalah masalah JS umum.Saya tidak pernah ingin menggunakan penyiaran,
$apply
dan / atau hal serupa, karena praktek OO yang baik akan selalu mengalahkan sihir Angular apa pun.sumber
$scope.errors = []; $scope.myService = new MyService($scope.errors);
errors
hidup mandiri dari$scope
. Itulah inti dari jawaban ini. Tolong periksa tautan yang saya berikan dalam teks. Bersulang.$scope.errors
itu menunjuk kevar errors
, dan kesalahan variabel tampak berlebihan bagi saya, karena itu hanya penunjuk lain. Satu situasi yang sama saya bisa memikirkan dan bahwa itu terang-terangan berlebihan adalah potongan kode ini:const errors = errors2 = errors3 = []; $scope.errors = errors;
. Apakah Anda setuju bahwa hanya dengan potongan kode yang Anda berikan tampaknya ituvar errors = []
berlebihan?errors
hidup secara mandiri$scope
. Anda perlu memahami apa itu objek domain, serta apa ituvar
tugas. Jika tautan yang saya berikan tidak cukup, ada banyak materi lain yang tersedia.MyService(errors)
. Dalam pemahaman saya, layanan harus menghasilkan array logging berdasarkan parameter (dalam hal ini pointer). Bagi saya itu pola yang buruk, karena layanannya adalah lajang bersudut. Jika implementasi layanan diprogram dengan baik, itu harus menghasilkan array dalam variabel internal (untuk tetap menjadi tunggal). Oleh karena itu, tidak ada gunanya menginisialisasi variabel di luar layanan.