414 Stimmen

Wie dynamisch ändern Header basierend auf AngularJS teilweise Ansicht?

Ich verwende ng-view, um AngularJS Teilansichten einzuschließen, und ich möchte den Seitentitel und die h1-Header-Tags basierend auf der eingeschlossenen Ansicht aktualisieren. Diese sind außerhalb des Anwendungsbereichs der partiellen Ansicht-Controller aber, und so kann ich nicht herausfinden, wie man sie an Daten in den Controllern festgelegt binden.

Wenn es ASP.NET MVC wäre, könnte man @ViewBag verwenden, aber ich kenne das Äquivalent in AngularJS nicht. Ich habe über gemeinsame Dienste, Ereignisse usw. gesucht, aber immer noch nicht bekommen es funktioniert. Jede Möglichkeit, mein Beispiel zu ändern, so dass es funktioniert, wäre sehr geschätzt werden.

Mein HTML:

<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>

Mein JavaScript:

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"; }

632voto

jkoreska Punkte 7200

Ich habe gerade eine gute Möglichkeit entdeckt, den Seitentitel zu setzen, wenn Sie Routing verwenden:

JavaScript:

var myApp = angular.module('myApp', ['ngResource'])

myApp.config(
    ['$routeProvider', function($routeProvider) {
        $routeProvider.when('/', {
            title: 'Home',
            templateUrl: '/Assets/Views/Home.html',
            controller: 'HomeController'
        });
        $routeProvider.when('/Product/:id', {
            title: 'Product',
            templateUrl: '/Assets/Views/Product.html',
            controller: 'ProductController'
        });
    }]);

myApp.run(['$rootScope', function($rootScope) {
    $rootScope.$on('$routeChangeSuccess', function (event, current, previous) {
        $rootScope.title = current.$$route.title;
    });
}]);

H

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <title ng-bind="'myApp &mdash; ' + title">myApp</title>
...

bearbeiten : unter Verwendung der ng-bind Attribut anstelle von Locken {{}} damit sie beim Laden nicht angezeigt werden

343voto

Tosh Punkte 35915

Sie könnten den Controller auf der <html> Ebene.

 <html ng-app="app" ng-controller="titleCtrl">
   <head>
     <title>{{ Page.title() }}</title>
 ...

Sie schaffen Service: Page und von Controllern ändern.

myModule.factory('Page', function() {
   var title = 'default';
   return {
     title: function() { return title; },
     setTitle: function(newTitle) { title = newTitle }
   };
});

Einspritzen Page und Aufruf von 'Page.setTitle()' aus Controllern.

Hier ein konkretes Beispiel: http://plnkr.co/edit/0e7T6l

197voto

broc.seib Punkte 20286

Beachten Sie, dass Sie den Titel auch direkt mit Javascript setzen können, d.h.,

$window.document.title = someTitleYouCreated;

Dies hat keine Datenbindung, aber es reicht aus, wenn man ng-app en el <html> Tag ist problematisch. (Zum Beispiel bei der Verwendung von JSP-Templates, bei denen <head> ist genau an einer Stelle definiert, aber Sie haben mehr als eine Anwendung).

120voto

Andy Hitchman Punkte 1351

Erklärung von ng-app en el html Element bietet Root-Scope sowohl für das head y body .

Daher injizieren Sie in Ihrem Controller $rootScope und setzen Sie eine Kopfzeileneigenschaft für diese:

function Test1Ctrl($rootScope, $scope, $http) { $rootScope.header = "Test 1"; }

function Test2Ctrl($rootScope, $scope, $http) { $rootScope.header = "Test 2"; }

und auf Ihrer Seite:

<title ng-bind="header"></title>

43voto

Martin Atkins Punkte 45938

Das Modul angularjs-viewhead zeigt einen Mechanismus zum Festlegen des Titels für jede einzelne Ansicht mit Hilfe einer benutzerdefinierten Direktive.

Er kann entweder auf ein bestehendes Ansichtselement angewendet werden, dessen Inhalt bereits der Titel der Ansicht ist:

<h2 view-title>About This Site</h2>

...oder es kann als eigenständiges Element verwendet werden. In diesem Fall ist das Element im gerenderten Dokument unsichtbar und wird nur zum Setzen des Ansichtstitels verwendet:

<view-title>About This Site</view-title>

Der Inhalt dieser Richtlinie wird im Geltungsbereich Root zur Verfügung gestellt als viewTitle Sie kann also im Titelelement wie jede andere Variable verwendet werden:

<title ng-bind-template="{{viewTitle}} - My Site">My Site</title>

Es kann auch an jeder anderen Stelle verwendet werden, die das Root-Scope "sehen" kann. Zum Beispiel:

<h1>{{viewTitle}}</h1>

Bei dieser Lösung kann der Titel über denselben Mechanismus eingestellt werden, der auch für den Rest der Präsentation verwendet wird: AngularJS-Vorlagen. Dadurch wird vermieden, dass Controller mit dieser Präsentationslogik überfrachtet werden müssen. Der Controller muss alle Daten zur Verfügung stellen, die verwendet werden, um informieren die Überschrift, aber die Vorlage entscheidet endgültig, wie sie dargestellt wird, und kann die Interpolation von Ausdrücken und Filtern verwenden, um wie üblich an Bereichsdaten zu binden.

(Disclaimer: Ich bin der Autor dieses Moduls, aber ich verweise hier nur in der Hoffnung, dass es jemand anderem hilft, dieses Problem zu lösen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X