Saya memiliki tiga pengontrol yang sangat mirip. Saya ingin memiliki pengontrol yang diperluas ketiga dan fungsinya.
sumber
Saya memiliki tiga pengontrol yang sangat mirip. Saya ingin memiliki pengontrol yang diperluas ketiga dan fungsinya.
Mungkin Anda tidak memperpanjang pengontrol tetapi dimungkinkan untuk memperluas pengontrol atau membuat pengontrol tunggal sebagai campuran dari beberapa pengontrol.
module.controller('CtrlImplAdvanced', ['$scope', '$controller', function ($scope, $controller) {
// Initialize the super class and extend it.
angular.extend(this, $controller('CtrlImpl', {$scope: $scope}));
… Additional extensions to create a mixin.
}]);
Ketika pengendali induk dibuat, logika yang terkandung di dalamnya juga dieksekusi. Lihat $ controller () untuk informasi lebih lanjut tentang tetapi hanya $scope
nilai yang harus dilewati. Semua nilai lain akan disuntikkan secara normal.
@ mwarren , kekhawatiran Anda diatasi secara otomatis dengan injeksi ketergantungan sudut. Yang Anda butuhkan adalah menyuntikkan $ scope, meskipun Anda bisa mengganti nilai yang disuntikkan lainnya jika diinginkan. Ambil contoh berikut:
(function(angular) {
var module = angular.module('stackoverflow.example',[]);
module.controller('simpleController', function($scope, $document) {
this.getOrigin = function() {
return $document[0].location.origin;
};
});
module.controller('complexController', function($scope, $controller) {
angular.extend(this, $controller('simpleController', {$scope: $scope}));
});
})(angular);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script>
<div ng-app="stackoverflow.example">
<div ng-controller="complexController as C">
<span><b>Origin from Controller:</b> {{C.getOrigin()}}</span>
</div>
</div>
Meskipun $ document tidak dimasukkan ke dalam 'simpleController' ketika itu dibuat oleh 'complexController' $ document disuntikkan untuk kita.
$.extend()
, Anda cukup menelepon$controller('CtrlImpl', {$scope: $scope});
angular.extend
(atau$.extend
) sebenarnya berarti memperluas$scope
satu - satunya, tetapi jika pengendali basis Anda juga mendefinisikan beberapa properti (misalnyathis.myVar=5
), Anda hanya memiliki akses kethis.myVar
dalam pengontrol perpanjangan ketika menggunakanangular.extend
handleSubmitClick
yang akan memanggilhandleLogin
yang pada gilirannya memilikiloginSuccess
danloginFail
. Jadi, dalam controller diperpanjang saya kemudian harus membebanihandleSubmitClick
,handleLogin
danloginSucess
untuk yang benarloginSuccess
fungsi yang akan digunakan.Untuk warisan Anda dapat menggunakan pola warisan JavaScript standar. Berikut ini adalah demo yang digunakan
$injector
Jika Anda menggunakan
controllerAs
sintaks (yang sangat saya rekomendasikan), akan lebih mudah untuk menggunakan pola pewarisan klasik:Cara lain bisa dengan membuat fungsi konstruktor "abstrak" yang akan menjadi basis controller Anda:
Posting blog tentang topik ini
sumber
Yah, saya tidak begitu yakin apa yang ingin Anda capai, tetapi biasanya Layanan adalah cara untuk pergi. Anda juga dapat menggunakan karakteristik pewarisan Lingkup Angular untuk berbagi kode antara pengontrol:
sumber
$scope.$parent.fx( )
menjadi cara yang jauh lebih bersih untuk melakukannya, karena di situlah sebenarnya didefinisikan?Anda tidak memperpanjang pengontrol. Jika mereka melakukan fungsi dasar yang sama maka fungsi-fungsi tersebut perlu dipindahkan ke layanan. Layanan itu dapat disuntikkan ke pengendali Anda.
sumber
Solusi lain yang baik diambil dari artikel ini :
sumber
Anda dapat membuat layanan dan mewarisi perilakunya di pengontrol apa pun hanya dengan menyuntikkannya.
Kemudian di controller Anda yang ingin Anda rentangkan dari layanan reusableCode di atas:
DEMO PLUNKER: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
sumber
Anda dapat mencoba sesuatu seperti ini (belum diuji):
sumber
Anda dapat memperluas dengan layanan , pabrik , atau penyedia . mereka sama tetapi dengan tingkat fleksibilitas yang berbeda.
di sini contoh menggunakan pabrik: http://jsfiddle.net/aaaflyvw/6KVtj/2/
Dan di sini Anda dapat menggunakan fungsi toko juga:
sumber
Anda dapat langsung menggunakan contoh $ controller ('ParentController', {$ scope: $ scope})
sumber
Anda dapat menggunakan sintaks Angular "sebagai" yang dikombinasikan dengan pewarisan JavaScript biasa
Lihat lebih detail di sini http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
sumber
Saya menulis fungsi untuk melakukan ini:
Anda bisa menggunakannya seperti ini:
Pro:
Cons:
sumber
Saya menganggap memperluas pengontrol sebagai praktik buruk. Alih-alih menempatkan logika Anda bersama ke dalam layanan. Objek yang diperluas dalam javascript cenderung menjadi agak rumit. Jika Anda ingin menggunakan warisan, saya akan merekomendasikan naskah. Namun, pengontrol tipis adalah cara yang lebih baik untuk masuk ke sudut pandang saya.
sumber