Saya memiliki arahan yang memiliki pengontrolnya sendiri. Lihat kode di bawah ini:
var popdown = angular.module('xModules',[]);
popdown.directive('popdown', function () {
var PopdownController = function ($scope) {
this.scope = $scope;
}
PopdownController.prototype = {
show:function (message, type) {
this.scope.message = message;
this.scope.type = type;
},
hide:function () {
this.scope.message = '';
this.scope.type = '';
}
}
var linkFn = function (scope, lElement, attrs, controller) {
};
return {
controller: PopdownController,
link: linkFn,
replace: true,
templateUrl: './partials/modules/popdown.html'
}
});
Ini dimaksudkan sebagai sistem pemberitahuan untuk kesalahan / pemberitahuan / peringatan. Yang ingin saya lakukan adalah dari pengontrol lain (bukan pengarah) untuk memanggil fungsi show
pada pengontrol ini. Dan ketika saya melakukannya, saya juga ingin fungsi tautan saya mendeteksi bahwa beberapa properti berubah dan melakukan beberapa animasi.
Berikut beberapa kode untuk menunjukkan apa yang saya minta:
var app = angular.module('app', ['RestService']);
app.controller('IndexController', function($scope, RestService) {
var result = RestService.query();
if(result.error) {
popdown.notify(error.message, 'error');
}
});
Jadi saat memanggil show
pada popdown
kontroler direktif, fungsi link yang juga harus dipicu dan melakukan animasi. Bagaimana saya bisa mencapai itu?
javascript
jquery
angularjs
angularjs-directive
pengguna253530
sumber
sumber
popdown
arahan di halaman - apakah hanya di satu tempat di mana pengontrol lain seharusnya memiliki akses ke sana, atau apakah ada beberapa munculan di tempat yang berbeda?popdown.show(...)
bukankahpopdown.notify(...)
itu benar? Jika tidak, fungsi notify agak membingungkan.popdown.notify
?.notifiy
metode, maksud sayaJawaban:
Ini adalah pertanyaan yang menarik, dan saya mulai berpikir tentang bagaimana saya akan menerapkan sesuatu seperti ini.
Saya datang dengan ini (biola) ;
Pada dasarnya, alih-alih mencoba memanggil arahan dari pengontrol, saya membuat modul untuk menampung semua logika popdown:
Saya meletakkan dua hal di modul,
factory
untuk API yang dapat disuntikkan di mana saja, dandirective
untuk menentukan perilaku elemen popdown yang sebenarnya:Pabrik hanya menetapkan beberapa fungsi
success
danerror
dan melacak beberapa variabel:Direktif memasukkan API ke dalam pengontrolnya, dan mengawasi api untuk perubahan (saya menggunakan bootstrap css untuk kenyamanan):
Kemudian saya mendefinisikan
app
modul yang bergantung padaPopdown
:Dan HTML-nya terlihat seperti:
Saya tidak yakin apakah itu benar-benar ideal, tetapi sepertinya cara yang masuk akal untuk mengatur komunikasi dengan arahan popdown global-ish.
Sekali lagi, untuk referensi, biola .
sumber
success(msg)
html Anda akan memanggilsucess(name, msg)
untuk memilih direktif dengan nama yang benar.Anda juga dapat menggunakan acara untuk memicu Popdown.
Ini biola berdasarkan solusi satchmorun. Ini membagi dengan PopdownAPI, dan pengontrol tingkat atas sebagai gantinya
$broadcast
'sukses' dan 'kesalahan' kejadian di rantai lingkup:Modul Popdown kemudian mendaftarkan fungsi penangan untuk kejadian ini, misalnya:
Ini berfungsi, setidaknya, dan menurut saya merupakan solusi yang dipisahkan dengan baik. Saya akan membiarkan orang lain ikut campur jika ini dianggap praktik yang buruk karena alasan tertentu.
sumber
Anda juga dapat mengekspos controller direktif ke lingkup induk, seperti
ngForm
denganname
atribut: http://docs.angularjs.org/api/ng.directive:ngFormDi sini Anda dapat menemukan contoh yang sangat mendasar bagaimana hal itu dapat dicapai http://plnkr.co/edit/Ps8OXrfpnePFvvdFgYJf?p=preview
Dalam contoh ini saya memiliki
myDirective
pengontrol khusus dengan$clear
metode (semacam API publik yang sangat sederhana untuk arahan). Saya dapat mempublikasikan pengontrol ini ke lingkup induk dan menggunakan panggilan metode ini di luar arahan.sumber
$scope.$parent[alias]
karena baunya buat saya suka pake internal angular api. Tetapi masih tidak dapat menemukan solusi yang lebih elegan untuk perintah non-tunggal. Varian lain seperti acara penyiaran atau mendefinisikan objek kosong di pengontrol induk untuk arahan api lebih berbau.Saya mendapat solusi yang jauh lebih baik.
di sini adalah direktif saya, saya telah menyuntikkan referensi objek dalam direktif dan telah memperluasnya dengan menambahkan fungsi pemanggilan dalam kode direktif.
Mendeklarasikan direktif di HTML dengan parameter:
Kontroler saya:
sumber