Di dalam modul, pengontrol dapat mewarisi properti dari pengontrol luar:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Contoh melalui: Tautan mati : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
Bisakah juga kontroler di dalam modul yang diwarisi dari saudara kandung?
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function($scope) {
//I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope}); //This does not work
});
Kode kedua tidak berfungsi karena $injector.invoke
memerlukan fungsi sebagai parameter pertama dan tidak menemukan referensi ParentCtrl
.
angularjs
inheritance
angularjs-controller
Federico Elles
sumber
sumber
Jawaban:
Ya, itu bisa tetapi Anda harus menggunakan
$controller
layanan untuk instantiate controller sebagai gantinya: -sumber
ParentCtrl
harus menjadicontroller
atau mungkin menggunakanservice
?$controller
hanya dapat menggunakan pengontrol terdaftar.$scope
menjadithis
(secara teori)Jika Anda menggunakan
vm
sintaks controller , berikut ini solusinya:Sayangnya, Anda tidak dapat menggunakan
$controller.call(vm, 'BaseGenericCtrl'...)
, untuk mengirimkan konteks saat ini kereload()
fungsi closure (for ), karenanya hanya satu solusi yang digunakanthis
di dalam fungsi yang diwarisi untuk mengubah konteks secara dinamis.sumber
vm
hanyalah sebuah variabel di dalam kontroler, saya tidak berpikir begitu Angular dapat menggunakannya seperti yang diharapkan.Saya pikir, Anda harus menggunakan pabrik atau layanan, untuk memberikan fungsi atau data yang dapat diakses untuk kedua pengendali.
di sini adalah pertanyaan serupa ---> warisan pengontrol AngularJS
sumber
loading
variabel universal sehingga ketika data dimuat saya selalu melakukan hal yang sama, saya tidak berpikir pabrik bisa melakukan itu. Pengontrol orang tua saya dapat memiliki variabel pemuatan tetapi pabrik tidak dapat memanipulasinya ... kan ?!Menanggapi masalah yang diangkat dalam jawaban ini oleh gmontague , saya telah menemukan metode untuk mewarisi pengontrol menggunakan $ controller (), dan masih menggunakan sintaks controller "as".
Pertama, gunakan sintaks "sebagai" saat Anda mewarisi memanggil $ controller ():
Kemudian, dalam templat HTML, jika properti ditentukan oleh induk, lalu gunakan
parent.
untuk mengambil properti yang diwarisi dari induk; jika ditentukan oleh child, maka gunakanchild.
untuk mengambilnya.sumber
Yah, saya melakukan ini dengan cara lain. Dalam kasus saya, saya ingin fungsi yang menerapkan fungsi dan properti yang sama di pengontrol lain. Saya menyukainya, kecuali berdasarkan parameter. Dengan cara ini, semua ChildCtrls Anda perlu menerima $ lokasi.
sumber
Bagi mereka yang bertanya-tanya, Anda dapat memperluas pengontrol komponen dengan cara yang sama, menggunakan metode dalam jawaban yang diterima.
Gunakan pendekatan berikut:
Komponen induk (untuk memperpanjang dari):
Komponen anak (yang membentang):
Caranya adalah dengan menggunakan pengendali bernama, daripada mendefinisikan mereka dalam definisi komponen.
sumber
Seperti disebutkan dalam jawaban yang diterima, Anda dapat "mewarisi" modifikasi pengendali orang tua ke $ scope dan layanan lain dengan menelepon:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
di pengendali anak Anda.Namun , ini gagal jika Anda terbiasa menggunakan sintaks 'as' controller, misalnya dalam
Jika
foo
diatur di pengontrol induk (viathis.foo = ...
), pengontrol anak tidak akan memiliki akses ke sana.Seperti disebutkan dalam komentar, Anda dapat menetapkan hasil $ controller langsung ke lingkup:
Catatan: Anda kemudian harus menghapus bagian 'as' dari
ng-controller=
, karena Anda menentukan nama instance dalam kode, dan tidak lagi template.sumber
Saya menggunakan sintaks "Controller as" dengan
vm = this
dan ingin mewarisi sebuah controller. Saya punya masalah jika controller orangtua saya memiliki fungsi yang mengubah variabel.Menggunakan jawaban IProblemFactory dan Salman Abbas , saya melakukan hal berikut untuk memiliki akses ke variabel induk:
sumber
Anda dapat menggunakan mekanisme pewarisan JavaScript sederhana. Juga jangan lupa berikan layanan sudut yang perlu untuk memanggil metode .call.
sumber
Lihat tautan yang disebutkan di bawah ini untuk pewarisan AngularJs.
Controller-Inheritance-in-angularjs
sumber