Saya baru mengenal Angular dan mencoba mencari cara untuk melakukan sesuatu ...
Menggunakan AngularJS, bagaimana saya bisa menyuntikkan pengontrol untuk digunakan dalam pengontrol lain?
Saya memiliki cuplikan berikut:
var app = angular.module("testApp", ['']);
app.controller('TestCtrl1', ['$scope', function ($scope) {
$scope.myMethod = function () {
console.log("TestCtrl1 - myMethod");
}
}]);
app.controller('TestCtrl2', ['$scope', 'TestCtrl1', function ($scope, TestCtrl1) {
TestCtrl1.myMethod();
}]);
Ketika saya menjalankan ini, saya mendapatkan kesalahan:
Error: [$injector:unpr] Unknown provider: TestCtrl1Provider <- TestCtrl1
http://errors.angularjs.org/1.2.21/$injector/unpr?p0=TestCtrl1Provider%20%3C-%20TestCtrl1
Haruskah saya mencoba menggunakan pengontrol di dalam pengontrol lain, atau haruskah saya menjadikan ini layanan?
TestCtrl1
ke layanan.Jawaban:
Jika maksud Anda adalah untuk mendapatkan kontroler yang sudah dipakai dari komponen lain dan jika Anda mengikuti pendekatan berbasis komponen / direktif, Anda selalu dapat
require
mengontrol (turunan komponen) dari komponen lain yang mengikuti hierarki tertentu.Sebagai contoh:
Sekarang penggunaan komponen di atas mungkin seperti ini:
Ada banyak cara untuk mengatur keperluan .
Jawaban Lama:
Anda perlu memasukkan
$controller
layanan untuk membuat instance pengontrol di dalam pengontrol lain. Namun ketahuilah bahwa ini mungkin menyebabkan beberapa masalah desain. Anda selalu dapat membuat layanan yang dapat digunakan kembali yang mengikuti Tanggung Jawab Tunggal dan memasukkannya ke dalam pengontrol sesuai kebutuhan.Contoh:
Bagaimanapun, Anda tidak dapat memanggil
TestCtrl1.myMethod()
karena Anda telah memasang metode pada$scope
dan bukan pada contoh pengontrol.Jika Anda berbagi pengontrol, maka akan selalu lebih baik untuk melakukan: -
dan saat mengkonsumsi lakukan:
Dalam kasus pertama
$scope
adalah model tampilan Anda, dan dalam kasus kedua adalah contoh pengontrol itu sendiri.sumber
var testCtrl1ViewModel = $scope.$new();
menjadivar testCtrl1ViewModel = $rootScope.$new();
? lihat: docs.angularjs.org/guide/controller @PSLSaya menyarankan pertanyaan yang harus Anda tanyakan adalah bagaimana menyuntikkan layanan ke dalam pengontrol. Layanan gemuk dengan pengontrol kurus adalah aturan praktis yang baik, alias cukup gunakan pengontrol untuk merekatkan layanan / pabrik Anda (dengan logika bisnis) ke dalam tampilan Anda.
Pengontrol mendapatkan sampah yang dikumpulkan pada perubahan rute, jadi misalnya, jika Anda menggunakan pengontrol untuk menahan logika bisnis yang memberikan nilai, Anda akan kehilangan status pada dua halaman jika pengguna aplikasi mengklik tombol kembali browser.
Ini adalah pekerjaan demo pabrik yang disuntikkan ke dalam dua pengontrol
Juga, saya sarankan membaca tutorial ini tentang layanan / pabrik.
sumber
Tidak perlu mengimpor / menyuntikkan pengontrol Anda di JS. Anda cukup menyuntikkan pengontrol / pengontrol bersarang Anda melalui HTML. Ini berhasil untuk saya. Suka :
sumber
Ini bekerja paling baik dalam kasus saya, di mana TestCtrl2 memiliki arahannya sendiri.
Ini memberi saya kesalahan yang mengatakan kesalahan injeksi scopeProvider.
Ini tidak benar-benar berfungsi jika Anda memiliki arahan di 'TestCtrl1', arahan itu sebenarnya memiliki cakupan yang berbeda dari yang dibuat di sini. Anda berakhir dengan dua contoh 'TestCtrl1'.
sumber
Solusi terbaik:-
// Di sini Anda mendapat panggilan kontroler pertama tanpa menjalankannya
sumber
Anda juga dapat menggunakan
$rootScope
untuk memanggil fungsi / metode pengontrol pertama dari pengontrol kedua seperti ini,sumber
gunakan skrip ketikan untuk pengkodean Anda, karena berorientasi objek, diketik dengan ketat, dan mudah memelihara kodenya ...
untuk info lebih lanjut tentang typescipt klik di sini
Di sini satu contoh sederhana yang telah saya buat untuk berbagi data antara dua pengontrol menggunakan Skrip Ketik ...
}
sumber