Saya ingin tahu adalah bagaimana menggunakan beberapa pengontrol untuk aplikasi satu halaman. Saya telah mencoba mengetahuinya dan saya telah menemukan pertanyaan yang sangat mirip dengan pertanyaan saya, tetapi hanya ada satu ton jawaban berbeda yang memecahkan masalah tertentu di mana Anda akhirnya tidak menggunakan banyak pengontrol untuk satu aplikasi halaman.
Apakah karena tidak bijaksana menggunakan banyak pengontrol untuk satu halaman? Atau itu tidak mungkin?
Katakanlah saya sudah memiliki pengontrol carousel gambar kick-ass yang bekerja di halaman utama, tetapi kemudian saya belajar bagaimana (katakanlah) menggunakan modal dan saya membutuhkan pengontrol baru untuk itu juga (atau hal lain yang saya perlukan pengontrol). Apa yang akan saya lakukan?
Saya telah melihat beberapa jawaban untuk pertanyaan lain di mana mereka menanyakan hal yang hampir sama dengan saya dan orang-orang menjawab "* OMG. Mengapa Anda melakukan itu, lakukan saja ...".
Apa cara terbaik, atau bagaimana Anda melakukannya?
Edit
Banyak dari Anda yang menjawab untuk hanya mendeklarasikan dua pengontrol dan kemudian menggunakan ng-controller untuk memanggilnya. Saya menggunakan sedikit kode di bawah ini dan kemudian memanggil MainCtrl dengan ng-controller.
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: "templates/main.html",
controller:'MainCtrl',
})
.otherwise({
template: 'does not exists'
});
});
Mengapa saya bahkan perlu menyetel pengontrol di sini jika saya bisa menggunakan ng-controller tanpa itu? Inilah yang membuatku bingung. (dan Anda tidak dapat menambahkan dua pengontrol dengan cara ini, saya pikir ...)
sumber
when: /home, controller: MainCtrl
. tidak dapat menambahkan lebih dari itu, atau apakah Anda bermaksud menyebutnya dengan ng-controller?Jawaban:
Apa masalahnya? Untuk menggunakan banyak pengontrol, cukup gunakan beberapa direktif ngController:
Anda harus memiliki pengontrol yang tersedia di modul aplikasi Anda, seperti biasa.
Cara paling dasar untuk melakukannya bisa sesederhana mendeklarasikan fungsi pengontrol seperti ini:
sumber
when /home, controller: MainCtrl
ng-controller
beberapa elemen DOM, dikatakan dalam skenario di mana saya memiliki BANYAK item yang dicetak ke DOM melaluing-repeat
. Misalkan masing-masing melakukan panggilan keng-controller="myController
. Dari beberapa log konsol yang saya lihat di aplikasi saya,myController
diinisialisasi ulang dengan SETIAP elemen yang dirender di DOM yang memanggilnya .... Mungkin saya mengacaukan sesuatu dalam penggunaan khusus saya, atau mungkin di luar cakupan OP pertanyaan, tetapi penasaran apakah orang lain pernah mengalaminya sama sekali ....Saya pikir Anda kehilangan arti "aplikasi satu halaman".
Itu tidak berarti Anda secara fisik akan memiliki satu .html, sebaliknya Anda akan memiliki satu
index.html
file .html utama dan beberapa NESTED. Jadi mengapa aplikasi satu halaman? Karena dengan cara ini Anda tidak memuat halaman dengan cara standar (yaitu panggilan browser yang menyegarkan halaman penuh) tetapi Anda hanya memuat bagian konten menggunakan Angular / Ajax. Karena Anda tidak melihat kedipan di antara perubahan halaman, Anda mendapat kesan bahwa Anda tidak berpindah dari halaman. Dengan demikian, Anda merasa seperti tinggal di satu halaman.Sekarang, saya berasumsi bahwa Anda ingin memiliki konten GANDA untuk aplikasi SINGLE PAGE Anda: (misalnya) rumah, kontak, portofolio, dan toko. Aplikasi satu halaman / beberapa konten Anda (cara bersudut) akan diatur seperti ini:
index.html
: berisi header,<ng-view>
dan footercontacts.html
: berisi formulir kontak (tanpa header, tanpa footer)portfolio.html
: berisi data portofolio (tanpa header tanpa footer)store.html
: berisi penyimpanan, tidak ada header tanpa footer.Anda berada di indeks, Anda mengklik menu yang disebut "kontak" dan apa yang terjadi? Angular menggantikan
<ng-view>
tag dengancontacts.html
kodeBagaimana Anda mencapai itu? dengan
ngRoute
, saat Anda melakukannya, Anda akan memiliki sesuatu seperti:Ini akan memanggil html yang tepat meneruskan pengontrol yang tepat untuk itu (harap dicatat: jangan tentukan
ng-controller
direktifcontacts.html
jika Anda menggunakan rute )Kemudian, tentu saja, Anda dapat mendeklarasikan sebanyak mungkin arahan ng-controller di dalam halaman contacts.html Anda. Mereka akan menjadi pengendali anak
ContactCtrl
(jadi mewarisi darinya). Tetapi untuk satu rute, di dalamrouteProvider
, Anda dapat mendeklarasikan satu Kontroler yang akan bertindak sebagai "Pengontrol Ayah dari tampilan parsial".EDIT Bayangkan template / contacts.html berikut
di atas
routeProvider
akan menyuntikkan pengontrol ke div berisi Anda. Pada dasarnya html diatas otomatis menjadi:Ketika saya mengatakan Anda dapat memiliki pengontrol lain, berarti Anda dapat menyambungkan pengontrol ke elemen DOM bagian dalam, sebagai berikut:
Saya harap ini sedikit memperjelas.
SEBUAH
sumber
<div ng-controller="FancyStuffController">
di dalam tag body yang telah diterapkan pengontrol, misalnya<body ng-controller="BodyController">
, apakah ini akan berfungsi? im mendapatkan kesalahan tentang$apply already in progress
ketika saya melakukan ini, tetapi saya pikir itu terkait dengan dpd.js. Bukan untuk membahasnya, saya pikir itu hanya memuatnya dua kali atau sesuatu, tidak yakin bagaimana caranya, tetapi penggunaan pengontrol saya mungkin mencoba memuat ulang itu.Saat ini saya sedang dalam proses membangun aplikasi satu halaman. Inilah yang saya miliki sejauh ini yang saya yakini akan menjawab pertanyaan Anda. Saya memiliki template dasar (base.html) yang memiliki div dengan
ng-view
direktif di dalamnya. Arahan ini memberitahu angular di mana harus memasukkan konten baru. Perhatikan bahwa saya sendiri baru mengenal angularjs jadi saya tidak bermaksud mengatakan ini adalah cara terbaik untuk melakukannya.base.html
sumber
when /home
when
. Saya ingin dua pengontrol untuk satu template. Atau mungkin saya salah paham tentang apa yang ingin Anda sampaikan kepada saya?menuController memiliki akses untuk menu div. Dan widgetController memiliki akses ke keduanya.
sumber
Kita cukup mendeklarasikan lebih dari satu Controller dalam modul yang sama. Berikut contohnya:
sumber
Saya hanya meletakkan satu deklarasi sederhana dari aplikasi
Kemudian saya membangun satu layanan dan dua pengontrol
Untuk setiap pengontrol saya memiliki garis di JS
Dan di HTML saya mendeklarasikan cakupan aplikasi di div sekitarnya
dan setiap cakupan pengontrol secara terpisah di div sekitarnya sendiri (dalam div aplikasi)
Ini bekerja dengan baik
sumber
Anda juga bisa menyematkan semua tampilan template Anda ke file html utama Anda. Sebagai contoh:
Dengan cara ini jika setiap template membutuhkan pengontrol yang berbeda maka Anda masih dapat menggunakan angular-router. Lihat bagian ini untuk contoh kerja http://plnkr.co/edit/9X0fT0Q9MlXtHVVQLhgr?p=preview
Dengan cara ini setelah aplikasi dikirim dari server ke klien Anda, itu sepenuhnya mandiri dengan asumsi bahwa itu tidak perlu membuat permintaan data apa pun, dll.
sumber