Tampilkan munculan dengan cara yang paling elegan

178

Saya punya aplikasi AngularJS ini. Semuanya bekerja dengan baik.

Sekarang saya perlu menunjukkan pop-up yang berbeda ketika kondisi tertentu menjadi kenyataan, dan saya bertanya-tanya apa yang akan menjadi cara terbaik untuk melanjutkan.

Saat ini saya sedang mengevaluasi dua opsi, tetapi saya benar-benar terbuka untuk opsi lain.


Pilihan 1

Saya bisa membuat elemen HTML baru untuk pop-up, dan menambahkan ke DOM langsung dari controller.

Ini akan mematahkan pola desain MVC. Saya tidak senang dengan solusi ini.


pilihan 2

Saya selalu bisa memasukkan kode untuk semua pop-up di file HTML statis. Kemudian, menggunakan ngShow, saya bisa menyembunyikan / hanya menampilkan pop-up yang benar.

Opsi ini tidak benar-benar dapat diskalakan.


Jadi saya cukup yakin harus ada cara yang lebih baik untuk mencapai apa yang saya inginkan.

Bruno
sumber
banyak cara, pengontrol html pasti bukan cara yang baik, lihat UI Bootstrap Modal angular-ui.github.com/bootstrap/#/modal
charlietfl
1
Dokumen AngularJS menjelaskan sedikit cara mengelola sembulan , di bawah bagian ' Memahami Transklusi dan Lingkup '. Semoga ini membantu.
Ivan Ferrer Villa
Jika Anda benar-benar ingin menskala dengan popup maka periksa popscript .
Raj Nathani

Jawaban:

88

Berdasarkan pengalaman saya dengan AngularJS modals sejauh ini saya percaya bahwa pendekatan yang paling elegan adalah layanan khusus yang kami dapat menyediakan template parsial (HTML) untuk ditampilkan dalam modal.

Ketika kita memikirkannya, modals adalah jenis rute AngularJS tetapi hanya ditampilkan dalam modal popup.

Proyek bootstrap AngularUI ( http://angular-ui.github.com/bootstrap/ ) memiliki layanan yang sangat baik $modal(dulu disebut $ dialog sebelum versi 0.6.0) yang merupakan implementasi layanan untuk menampilkan konten parsial sebagai popup modal.

pkozlowski.opensource
sumber
10
$ dialog sekarang $ modal
Sangram Singh
1
@ pkozlowski.opensource Saya suka pendekatan ui-bootstrap namun saya tidak bisa mentransklusikan konten dengan modal. Saya telah meneliti beberapa dan melihat orang lain memiliki masalah ini juga.
jusopi
2
weblogs.asp.net/dwahlin/building-an-angularjs-modal-service Saya menemukan seni ini sangat berguna.
JenonD
Hanya untuk menyebutkan, layanan tidak boleh mengakses DOM. Arahan adalah tempat untuk ini.
superluminary
1
@superluminary ini memang aturan umum yang baik untuk diikuti, tetapi juga tuhan untuk mengetahui mengapa aturan tertentu sejalan dan memahami kapan aturan seperti itu dapat (atau bahkan harus!) dilanggar. Saya percaya bahwa modals / tooltips dan sejenisnya adalah pengecualian dari aturan. Singkatnya: orang perlu tahu aturan tetapi juga memahami konteks di mana aturan itu berlaku / tidak berlaku.
pkozlowski.opensource
29

Ini lucu karena saya belajar Angular sendiri dan menonton beberapa video dari saluran mereka di Youtube. Pembicara menyebutkan masalah sebenarnya Anda dalam video ini https://www.youtube.com/watch?v=ZhfUv0spHCY#t=1681 sekitar tanda 28:30 menit.

Itu datang untuk menempatkan potongan kode tertentu dalam layanan daripada pengontrol.

Dugaan saya adalah menyuntikkan elemen popup baru ke DOM dan menanganinya terpisah alih-alih menunjukkan dan menyembunyikan elemen yang sama. Dengan cara ini Anda dapat memiliki beberapa sembulan.

Seluruh video juga sangat menarik untuk ditonton :-)

Bart
sumber
2
Misko adalah benih sudut! (bwa haha). Serius ya. Menganggap kata-katanya sebagai yang sumber definitif untuk sudut.
deck
14
  • Buat arahan 'popup' dan terapkan pada wadah konten popup
  • Dalam arahan, bungkus konten dalam posisi absolut bersama dengan mask di bawahnya.
  • Tidak masalah untuk memindahkan 2 div di pohon DOM sesuai kebutuhan dari dalam arahan. Kode UI apa pun boleh dalam arahan, termasuk kode untuk menempatkan popup di tengah layar.
  • Buat dan ikat bendera boolean ke pengontrol. Bendera ini akan mengontrol visibilitas.
  • Buat variabel lingkup yang terkait dengan fungsi OK / Batalkan dll.

Mengedit untuk menambahkan contoh tingkat tinggi (tidak fungsional)

<div id='popup1-content' popup='showPopup1'>
  ....
  ....
</div>


<div id='popup2-content' popup='showPopup2'>
  ....
  ....
</div>



.directive('popup', function() {
  var p = {
      link : function(scope, iElement, iAttrs){
           //code to wrap the div (iElement) with a abs pos div (parentDiv)
          // code to add a mask layer div behind 
          // if the parent is already there, then skip adding it again.
         //use jquery ui to make it dragable etc.
          scope.watch(showPopup, function(newVal, oldVal){
               if(newVal === true){
                   $(parentDiv).show();
                 } 
              else{
                 $(parentDiv).hide();
                }
          });
      }


   }
  return p;
});
Ketan
sumber
$ menonton alih-alih 'menonton'. juga bukankah itu 'popup' dan bukannya 'showPopup' scope.watch(showPopup, function(newVal, oldVal){?
Sangram Singh
14

Lihat http://adamalbrecht.com/2013/12/12/creating-a-simple-modal-dialog-directive-in-angular-js/ untuk cara sederhana melakukan dialog modal dengan Angular dan tanpa perlu bootstrap

Sunting: Saya sejak itu menggunakan ng-dialog dari http://likeastore.github.io/ngDialog yang fleksibel dan tidak memiliki dependensi.

Nik Dow
sumber
1
Saya hanya melakukan sprint cepat dengan pendekatan ini hanya untuk menyadari bahwa ini bagus untuk pendekatan popup / modal tunggal, namun pikirkan UX khusus ini: Katakanlah pelanggan memesan item, dan UI menyajikan popup pesanan konfirmasi (jadi kami Sudah 'mengisi' popup Adam dengan konten). Sekarang kita klik kirim atau beli atau apa pun dari popup itu, dan ada kesalahan di mana pengguna perlu mengubah urutan itu di layar sebelumnya. Saya ingin menampilkan kesalahan itu di sembulan lain di tingkat atas. Pendekatan ini tidak memfasilitasi ini, saya tidak percaya.
jusopi
3
Benar tapi saya pikir lebih dari satu popup mungkin UI yang buruk.
Nik Dow
baik plugin adalah jawaban yang saya cari!
Andres Felipe
7

Angular-ui hadir dengan direktif dialog. Gunakan dan atur templateurl ke halaman apa pun yang ingin Anda sertakan. Itu adalah cara yang paling elegan dan saya telah menggunakannya dalam proyek saya juga. Anda dapat melewati beberapa parameter lain untuk dialog sesuai kebutuhan.

pengguna2203937
sumber
5
angular-bootstrap 0.6 dan seterusnya telah menggantikan $ dialog dengan $ modal. Itu berarti Anda perlu mengubah semua kode yang menggunakan $ dialog karena sudah usang dan menuliskannya dalam $ modal
Mohammad Umair Khan