Saya menggunakan ng-view untuk menyertakan tampilan parsial AngularJS, dan saya ingin memperbarui judul halaman dan tag header h1 berdasarkan pada tampilan yang disertakan. Ini berada di luar jangkauan pengendali tampilan parsial, jadi saya tidak tahu cara mengikatnya ke kumpulan data di pengontrol.
Jika itu adalah ASP.NET MVC Anda bisa menggunakan @ViewBag untuk melakukan ini, tapi saya tidak tahu padanannya di AngularJS. Saya telah mencari tentang layanan bersama, acara dll tetapi masih tidak bisa berfungsi. Cara apa pun untuk mengubah contoh saya sehingga berfungsi akan sangat dihargai.
HTML saya:
<html data-ng-app="myModule">
<head>
<!-- include js files -->
<title><!-- should changed when ng-view changes --></title>
</head>
<body>
<h1><!-- should changed when ng-view changes --></h1>
<div data-ng-view></div>
</body>
</html>
JavaScript saya:
var myModule = angular.module('myModule', []);
myModule.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/test1', {templateUrl: 'test1.html', controller: Test1Ctrl}).
when('/test2', {templateUrl: 'test2.html', controller: Test2Ctrl}).
otherwise({redirectTo: '/test1'});
}]);
function Test1Ctrl($scope, $http) { $scope.header = "Test 1";
/* ^ how can I put this in title and h1 */ }
function Test2Ctrl($scope, $http) { $scope.header = "Test 2"; }
Jawaban:
Anda bisa mendefinisikan pengontrol di
<html>
level.Anda membuat layanan:
Page
dan memodifikasi dari pengontrol.Suntikkan
Page
dan Panggil 'Page.setTitle ()' dari pengontrol.Berikut adalah contoh konkret: http://plnkr.co/edit/0e7T6l
sumber
$rootScope
daripada membuat controller tambahan.Saya baru saja menemukan cara yang bagus untuk mengatur judul halaman Anda jika Anda menggunakan perutean:
JavaScript:
HTML:
Sunting : menggunakan
ng-bind
atribut alih-alih ikal{{}}
agar tidak ditampilkan saat dimuatsumber
title = "Blog"
tetapi tidaktitle = '{{"Blog post " + post.title}}'
.current.title
jugacurrent.$route
kode lama dan itu berfungsi. Dengan peningkatan, $ ganda pada rute diperlukan.current.$$route
'/Product/:id'
. Apakah ada cara untuk memiliki:id
nilai dengan metode ini? Saya mencobatitle: function(params){return params.id;}
tetapi tidak berhasil ... Mungkin menggunakanresolve
?Perhatikan bahwa Anda juga dapat mengatur judul secara langsung dengan javascript, yaitu,
Ini tidak memiliki data yang mengikat, tapi itu sudah cukup saat meletakkan
ng-app
di<html>
tag bermasalah. (Misalnya, menggunakan templat JSP di mana<head>
didefinisikan tepat di satu tempat, namun Anda memiliki lebih dari satu aplikasi.)sumber
Menyatakan
ng-app
padahtml
elemen menyediakan ruang lingkup akar untuk keduahead
danbody
.Karenanya di controller Anda menyuntikkan
$rootScope
dan mengatur properti header pada ini:dan di halaman Anda:
sumber
document.title = "App"
;Modul angularjs-viewhead menunjukkan mekanisme untuk menetapkan judul berdasarkan per-view hanya menggunakan arahan khusus.
Ini dapat diterapkan ke elemen tampilan yang sudah ada yang kontennya sudah menjadi judul tampilan:
... atau dapat digunakan sebagai elemen mandiri, dalam hal ini elemen tersebut tidak akan terlihat dalam dokumen yang diberikan dan hanya akan digunakan untuk mengatur judul tampilan:
Isi dari arahan ini tersedia dalam ruang lingkup root sebagai
viewTitle
, sehingga dapat digunakan pada elemen judul seperti variabel lain:Itu juga dapat digunakan di tempat lain yang dapat "melihat" lingkup root. Sebagai contoh:
Solusi ini memungkinkan judul diatur melalui mekanisme yang sama yang digunakan untuk mengontrol sisa presentasi: Templat AngularJS. Ini menghindari perlunya mengacaukan pengontrol dengan logika presentasi ini. Pengontrol perlu menyediakan data apa pun yang akan digunakan untuk menginformasikan judul, tetapi templat membuat penentuan akhir tentang cara menyajikannya, dan dapat menggunakan interpolasi ekspresi dan filter untuk mengikat ke ruang lingkup data seperti biasa.
(Penafian: Saya adalah penulis modul ini, tapi saya merujuknya di sini hanya dengan harapan akan membantu orang lain untuk menyelesaikan masalah ini.)
sumber
Berikut ini adalah solusi yang diadaptasi yang berfungsi untuk saya yang tidak memerlukan injeksi $ rootScope ke dalam pengontrol untuk mengatur judul halaman sumber daya tertentu.
Di templat induk:
Dalam konfigurasi routing:
Dan di blok run:
Akhirnya di controller:
sumber
$rootScope.page.setTitle(current.$$route.title || current.$$route.controller.replace('Ctrl', ''));
this.title = title.replace('<', '<').replace('>', '>').replace(' & ', ' & ') + ' | Site Name';
solusi jkoreska sangat cocok jika Anda tahu judul sebelumnya, tetapi Anda mungkin perlu mengatur judul berdasarkan data yang Anda dapatkan dari sumber daya dll.
Solusi saya memerlukan satu layanan. Karena rootScope adalah basis dari semua elemen DOM, kita tidak perlu meletakkan pengontrol pada elemen html seperti seseorang yang disebutkan
Page.js
index.jade
Semua pengontrol yang perlu mengubah judul
sumber
{{title}}
gunakanng-bind='title'
ng-bind
mencegah sintaks pra-interpolasi dari menampilkan sebelum judul benar-benar mengevaluasi. +100Cara bersih yang memungkinkan pengaturan judul atau deskripsi meta secara dinamis. Dalam contoh saya menggunakan ui-router tetapi Anda dapat menggunakan ngRoute dengan cara yang sama.
HTML:
sumber
Atau, jika Anda menggunakan ui-router :
index.html
Rute
sumber
ui-router
memperbarui URL dan konten berdasarkan kondisi saya dan saya tidak mendapatkan kesalahan atau peringatan, tetapi saya tidak dapat mengakses bagian mana pun dari objek konfigurasi negara$state.current.[...]
. Versi apa yangui-router
Anda gunakan untuk melakukan ini?Solusi berbasis acara khusus
Berikut adalah pendekatan lain yang belum disebutkan oleh yang lain di sini (pada tulisan ini).
Anda dapat menggunakan acara khusus seperti:
Pendekatan ini memiliki keuntungan karena tidak memerlukan layanan tambahan untuk ditulis dan kemudian disuntikkan ke setiap pengontrol yang perlu mengatur judul, dan juga tidak (ab) menggunakan
$rootScope
. Ini juga memungkinkan Anda untuk mengatur judul dinamis (seperti dalam contoh kode), yang tidak mungkin menggunakan atribut data khusus pada objek konfigurasi router (sejauh yang saya tahu setidaknya).sumber
Untuk skenario yang tidak memiliki ngApp yang berisi
title
tag, cukup masukkan layanan ke pengontrol yang perlu mengatur judul jendela.Contoh kerja ... http://jsfiddle.net/8m379/1/
sumber
Jika Anda tidak memiliki kendali atas elemen judul (seperti formulir web asp.net) di sini adalah beberapa hal yang dapat Anda gunakan
sumber
Cara sederhana dan kotor menggunakan
$rootScope
:Di pengontrol Anda, ketika Anda memiliki data yang diperlukan untuk membuat judul, lakukan:
sumber
Tidak satu pun dari jawaban ini yang tampaknya cukup intuitif, jadi saya membuat arahan kecil untuk melakukan ini. Cara ini memungkinkan Anda untuk mendeklarasikan judul di halaman, di mana orang biasanya melakukannya, dan memungkinkannya menjadi dinamis juga.
Tentu saja Anda harus mengubah nama modul agar sesuai dengan Anda.
Untuk menggunakannya, cukup lempar ini ke tampilan Anda, seperti yang Anda lakukan pada
<title>
tag biasa :Anda juga bisa memasukkan teks biasa jika Anda tidak membutuhkannya secara dinamis:
Atau, Anda bisa menggunakan atribut, agar lebih ramah IE:
Anda dapat memasukkan teks apa pun yang Anda inginkan dalam tag, termasuk kode Angular. Dalam contoh ini, ini akan dicari
$scope.titleText
di mana controller tag judul kustom saat ini masukPastikan Anda tidak memiliki beberapa tag judul halaman pada halaman Anda, atau mereka akan saling mengalahkan.
Contoh plunker di sini http://plnkr.co/edit/nK63te7BSbCxLeZ2ADHV . Anda harus mengunduh zip dan menjalankannya secara lokal untuk melihat perubahan judul.
sumber
html
. Dalam arahan saya, saya juga menyuntikkanpageTitlePrefix
konstanta opsional .Solusi sederhana untuk angular-ui-router:
HTML:
App.js> blok myApp.config
App.js> myApp.run
sumber
Berikut cara berbeda untuk melakukan perubahan judul. Mungkin tidak scalable seperti fungsi pabrik (yang bisa menangani halaman tanpa batas) tetapi lebih mudah bagi saya untuk mengerti:
Di index.html saya, saya mulai seperti ini:
Lalu saya membuat sebagian yang disebut "nav.html":
Kemudian saya kembali ke "index.html" dan menambahkan nav.html menggunakan ng-include dan ng-view untuk parsial saya:
Perhatikan bahwa ng-jubah? Tidak ada hubungannya dengan jawaban ini tetapi menyembunyikan halaman sampai selesai memuat, sentuhan yang bagus :) Pelajari caranya di sini: Angularjs - ng-cloak / ng-show elements blink
Inilah modul dasar. Saya memasukkannya ke dalam file bernama "app.js":
Jika Anda melihat ke bagian akhir modul, Anda akan melihat bahwa saya memiliki halaman detail makhluk berdasarkan: id. Ini sebagian yang digunakan dari halaman Crispy Critters. [Corny, saya tahu - mungkin ini adalah situs yang merayakan semua jenis nugget ayam;) Bagaimanapun, Anda dapat memperbarui judul ketika pengguna mengklik tautan apa pun, jadi di halaman Crispy Critters utama saya yang mengarah ke halaman detail makhluk, di situlah pembaruan $ root.title akan muncul, seperti yang Anda lihat di nav.html di atas:
Maaf sangat berangin, tetapi saya lebih suka posting yang memberikan detail yang cukup untuk menjalankannya. Perhatikan bahwa halaman contoh dalam dokumen AngularJS kedaluwarsa dan menunjukkan versi ng-bind-template versi 0.9. Anda dapat melihat bahwa itu tidak jauh berbeda.
Setelah Pikir: Anda tahu ini tetapi ada di sini untuk orang lain; di bagian bawah index.html, seseorang harus menyertakan app.js dengan modul:
sumber
Ketika saya harus menyelesaikan ini, saya tidak dapat menempatkan tag
ng-app
pada halamanhtml
, jadi saya menyelesaikannya dengan sebuah layanan:sumber
Solusi Custom Event Based terinspirasi dari Michael Bromley
Saya tidak dapat membuatnya berfungsi dengan $ scope, jadi saya mencoba dengan rootScope, mungkin sedikit lebih kotor ... (terutama jika Anda melakukan penyegaran pada halaman yang tidak mendaftarkan acara)
Tetapi saya benar-benar menyukai gagasan tentang bagaimana berbagai hal digabungkan secara longgar.
Saya menggunakan angularjs 1.6.9
index.run.js
anyController.controller.js
index.html
Ini bekerja untuk saya :)
sumber
Sementara yang lain mungkin memiliki metode yang lebih baik, saya dapat menggunakan $ rootScope di controller saya, karena masing-masing pandangan saya / templat memiliki pengontrol yang berbeda. Anda harus menyuntikkan $ rootScope di setiap pengontrol. Walaupun ini mungkin tidak ideal, ini berfungsi untuk saya, jadi saya pikir saya harus meneruskannya. Jika Anda memeriksa halaman, itu menambah pengikatan ke tag judul.
Pengontrol Contoh:
Contoh Index.html tajuk:
Anda juga dapat mengatur pageTitle dan pageDescription ke nilai dinamis, seperti mengembalikan data dari panggilan REST:
Sekali lagi, orang lain mungkin memiliki ide yang lebih baik tentang cara mendekati ini, tetapi karena saya menggunakan pra-rendering, kebutuhan saya terpenuhi.
sumber
Terima kasih tosh shimayama untuk solusinya.
Saya pikir itu tidak begitu bersih untuk menempatkan layanan langsung ke
$scope
, jadi inilah sedikit variasi saya tentang itu: http://plnkr.co/edit/QJbuZZnZEDOBcYrJXWWsKontroler (yang dalam jawaban aslinya menurut saya sedikit terlalu bodoh) menciptakan objek ActionBar, dan yang ini dimasukkan ke dalam $ scope.
Objek bertanggung jawab untuk benar-benar menanyakan layanan. Itu juga menyembunyikan dari $ scope panggilan untuk mengatur URL templat, yang sebaliknya tersedia untuk pengontrol lain untuk mengatur URL.
sumber
Mr Hash memiliki jawaban terbaik sejauh ini, tetapi solusi di bawah ini membuatnya ideal (untuk saya) dengan menambahkan manfaat berikut:
Di router:
Di blok run:
sumber
Solusi yang lebih baik dan dinamis yang saya temukan adalah menggunakan $ watch untuk melacak perubahan variabel dan kemudian memperbarui judulnya.
sumber