Saya punya arahan, ini kode:
.directive('map', function() {
return {
restrict: 'E',
replace: true,
template: '<div></div>',
link: function($scope, element, attrs) {
var center = new google.maps.LatLng(50.1, 14.4);
$scope.map_options = {
zoom: 14,
center: center,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// create map
var map = new google.maps.Map(document.getElementById(attrs.id), $scope.map_options);
var dirService= new google.maps.DirectionsService();
var dirRenderer= new google.maps.DirectionsRenderer()
var showDirections = function(dirResult, dirStatus) {
if (dirStatus != google.maps.DirectionsStatus.OK) {
alert('Directions failed: ' + dirStatus);
return;
}
// Show directions
dirRenderer.setMap(map);
//$scope.dirRenderer.setPanel(Demo.dirContainer);
dirRenderer.setDirections(dirResult);
};
// Watch
var updateMap = function(){
dirService.route($scope.dirRequest, showDirections);
};
$scope.$watch('dirRequest.origin', updateMap);
google.maps.event.addListener(map, 'zoom_changed', function() {
$scope.map_options.zoom = map.getZoom();
});
dirService.route($scope.dirRequest, showDirections);
}
}
})
Saya ingin updateMap()
melakukan aksi pengguna. Tombol tindakan tidak ada pada arahan.
Apa cara terbaik untuk memanggil updateMap()
dari pengontrol?
angularjs
angularjs-directive
mcbjam
sumber
sumber
Jawaban:
Jika Anda ingin menggunakan cakupan terisolasi, Anda bisa melewatkan objek kontrol menggunakan pengikatan dua arah
=
variabel dari lingkup pengontrol. Anda juga dapat mengontrol beberapa contoh direktif yang sama pada halaman dengan objek kontrol yang sama.sumber
scope.control
ada, jika tidak tempat lain yang menggunakan arahan tetapi tidak perlu mengakses metode arahan dan tidak memilikicontrol
attr akan mulai melempar kesalahan tentang tidak dapat mengatur atribut padaundefined
Dengan asumsi bahwa tombol tindakan menggunakan pengontrol yang sama
$scope
dengan arahan, cukup tentukan fungsiupdateMap
di$scope
dalam fungsi tautan. Pengontrol Anda kemudian dapat memanggil fungsi itu ketika tombol aksi diklik.fiddle
Sesuai komentar @ FlorianF, jika direktif menggunakan ruang lingkup yang terisolasi, segalanya menjadi lebih rumit. Inilah salah satu cara untuk membuatnya bekerja: tambahkan
set-fn
atribut kemap
direktif yang akan mendaftarkan fungsi direktif dengan controller:fiddle
sumber
scope
properti ke dalam deklarasi direktif.Meskipun mungkin tergoda untuk mengekspos objek pada lingkup terisolasi dari direktif untuk memfasilitasi berkomunikasi dengannya, melakukan dapat menyebabkan kode "spaghetti" membingungkan, terutama jika Anda perlu untuk rantai komunikasi ini melalui beberapa level (pengontrol, untuk mengarahkan, ke arahan bersarang, dll.)
Kami awalnya menempuh jalan ini, tetapi setelah beberapa penelitian lebih lanjut menemukan bahwa itu lebih masuk akal dan menghasilkan kode yang lebih mudah dikelola dan dibaca untuk mengekspos peristiwa dan properti yang direktif akan digunakan untuk komunikasi melalui layanan kemudian menggunakan $ watch pada properti layanan di arahan atau kontrol lain yang perlu bereaksi terhadap perubahan tersebut untuk komunikasi.
Abstraksi ini bekerja sangat baik dengan kerangka injeksi ketergantungan AngularJS karena Anda dapat menyuntikkan layanan ke item apa pun yang perlu bereaksi terhadap peristiwa tersebut. Jika Anda melihat file Angular.js, Anda akan melihat bahwa arahan di sana juga menggunakan layanan dan $ menonton dengan cara ini, mereka tidak memaparkan peristiwa di ruang lingkup yang terisolasi.
Terakhir, dalam hal Anda perlu berkomunikasi antara arahan yang tergantung satu sama lain, saya akan merekomendasikan berbagi pengontrol antara arahan tersebut sebagai alat komunikasi.
Wiki AngularJS untuk Praktik Terbaik juga menyebutkan ini:
sumber
=
, variabel berisi nama metode dan argumen. (2) memperlihatkan string satu arah mengikat@
sebagai id topik dan biarkan callee mengirim acara tentang topik ini. Sekarang saya melihat wiki latihan terbaik. Saya pikir ada alasan untuk tidak melakukannya dengan cara Mei. Tapi saya masih belum begitu jelas, bagaimana cara kerjanya. Dalam kasus saya, saya membuat arahan tabset, saya ingin mengeksposswitchTab(tabIndex)
metode. Bisakah Anda memberi contoh lebih banyak?switchTab(tabIndex)
metode, Anda hanya akan mengikat ketabIndex
variabel. Pengontrol halaman Anda mungkin memiliki tindakan yang mengubah variabel itu. Anda mengikat / meneruskan variabel itu ke Petunjuk tab Anda. Petunjuk tab Anda kemudian dapat menonton variabel itu untuk perubahan, dan melakukan switchTab atas kemauan sendiri. Karena arahan memutuskan kapan / bagaimana cara mengontrol tabnya berdasarkan variabel. Itu bukan pekerjaan sumber eksternal, jika tidak sumber eksternal membutuhkan pengetahuan tentang cara kerja direktif, yang mungkin buruk.Membangun berdasarkan jawaban Oliver - Anda mungkin tidak selalu perlu mengakses metode dalam direktif, dan dalam kasus-kasus itu Anda mungkin tidak ingin harus membuat objek kosong dan menambahkan
control
attr ke direktif hanya untuk mencegahnya membuat kesalahan (cannot set property 'takeTablet' of undefined
).Anda juga mungkin ingin menggunakan metode di tempat lain dalam arahan.
Saya akan menambahkan tanda centang untuk memastikan
scope.control
ada, dan mengatur metode untuk itu dengan cara yang mirip dengan pola modul mengungkapkansumber
Sejujurnya, saya tidak benar-benar yakin dengan jawaban apa pun di utas ini. Jadi, inilah solusi saya:
Pendekatan Directive Handler (Manajer)
Metode ini agnostik terhadap apakah arahan itu
$scope
adalah yang dibagikan atau yang diisolasiA
factory
untuk mendaftarkan instance direktifKode direktif, saya biasanya meletakkan semua logika yang tidak berurusan dengan DOM di dalam pengontrol direktif. Dan mendaftarkan instance controller di dalam handler kami
kode templat
Akses instance pengontrol menggunakan
factory
& jalankan metode terbuka untuk umumPendekatan sudut
Mengambil daun dari buku sudut tentang bagaimana mereka berurusan
menggunakan $ parse dan mendaftarkan controller pada
$parent
scope. Teknik ini tidak bekerja pada$scope
arahan yang terisolasi .Akses di dalam pengontrol menggunakan
$scope.foo
sumber
$scope.foo
seharusnya$scope.my_form
$scope.foo
karena template kita adalah<div my-directive name="foo"></div>
danname
nilai atribut adalah 'foo'.<form
hanyalah contoh dari salah satu arahan sudut yang menggunakan teknik iniAgak terlambat, tetapi ini adalah solusi dengan lingkup terisolasi dan "peristiwa" untuk memanggil fungsi dalam direktif. Solusi ini terinspirasi oleh pos SO ini oleh satchmorun dan menambahkan modul dan API.
Buat API untuk berkomunikasi dengan arahan. The addUpdateEvent menambahkan acara ke array acara dan memperbaruiPeta panggilan setiap fungsi acara.
(Mungkin Anda harus menambahkan fungsionalitas untuk menghapus acara.)
Dalam arahan set referensi ke MapAPI dan tambahkan $ scope.updateMap sebagai acara ketika MapApi.updateMap dipanggil.
Di controller "main" tambahkan referensi ke MapApi dan panggil saja MapApi.updateMap () untuk memperbarui peta.
sumber
Anda dapat menentukan atribut DOM yang dapat digunakan untuk memungkinkan arahan untuk mendefinisikan fungsi pada lingkup induk. Lingkup induk kemudian dapat memanggil metode ini seperti yang lain. Di sini seorang plunker. Dan di bawah ini adalah kode yang relevan.
clearfn
adalah atribut pada elemen direktif di mana ruang lingkup induk dapat melewati properti lingkup yang direktif kemudian dapat diatur ke fungsi yang memenuhi perilaku yang diinginkan.sumber
scope: { clearFn: '=clearfn' }
).Cukup gunakan lingkup. $ Parent untuk menghubungkan fungsi yang dipanggil ke fungsi direktif
dalam HTML
sumber
Anda dapat memberi tahu nama metode untuk mengarahkan untuk menentukan mana yang ingin Anda panggil dari pengontrol tetapi tanpa ruang lingkup yang terpisah,
sumber
DIUJI Semoga ini bisa membantu seseorang.
Pendekatan sederhana saya (Pikirkan tag sebagai kode asli Anda)
sumber
Mungkin ini bukan pilihan terbaik, tetapi Anda dapat melakukan
angular.element("#element").isolateScope()
atau$("#element").isolateScope()
mengakses ruang lingkup dan / atau pengontrol arahan Anda.sumber
Cara mendapatkan pengontrol direktif dalam pengontrol halaman:
tulis custom directive untuk mendapatkan referensi ke directive controller dari elemen DOM:
gunakan di html pengontrol halaman:
Gunakan pengontrol direktif di pengontrol halaman:
Catatan: solusi yang diberikan hanya berfungsi untuk pengontrol arahan elemen (nama tag digunakan untuk mendapatkan nama arahan yang diinginkan).
sumber
Solusi di bawah ini akan berguna ketika, Anda memiliki pengontrol (baik induk maupun direktif (terisolasi)) dalam format 'controller As'
seseorang mungkin menganggap ini berguna,
pengarahan :
Pengendali direktif:
kode html:
sumber