2016-05-31 5 views
0

Ich möchte Titel dynamisch erhalten. Wie teile ich $ scope.title in indexCtrl?AngularJS: Wie kann ich Daten über Controller hinweg austauschen?

var app = angular.module('app', []); 

app.controller('firstCtrl', function($scope){ 
    $scope.title = 'OneFC'; 
}) 

app.controller('secondCtrl', function($scope){ 
    $scope.title = 'UFC'; 
}) 

app.controller('indexCtrl', function(){ 
    // i want to get the title here depends on the active state in ui-router. 
} 

Antwort

0

Wir haben einige Möglichkeiten, dies zu tun. Mit der Eigenschaft rootscope kann das genauso gehandhabt werden wie mit der globalen Variable in Ihrer App. Aber ich liebe OOP und ich denke, wir sollten die Verarbeitung von Daten in einem Service einkapseln.

-Code für den Service:

app.factory('titleFactory',function(){ 
    var _title = null; 
    return { 
     setTitle: function(title) { 
      this._title = title; 
     }, 

     getTitle: function() { 
      return this._title; 
     } 
    } 
}); 

nun in jedem Controller brauchen Sie nur injizieren und rufen und festlegen Titel Ihre Daten zu verarbeiten.

Set Titel Wert (gleich für secondCtrl):

app.controller('firstCtrl', function($scope,titleFactory){ 
     titleFactory.setTitle('OneFC'); 
}) 

Titel können nun von allen anderen Steuerungen wie folgt zugegriffen werden:

app.controller('indexCtrl', function(){ 
    $scope.title = titleFactory.getTitle(); 
}); 
+0

Versucht es, aber kein Glück. –

+0

Up Ihren Code zu plunkr, so können wir sehen, warum Sie "kein Glück" –

+0

https://plnkr.co/edit/hGHC5mQSitee5957rZZC?p=preview –

0

versuchen, $rootScope.title zu verwenden?

app.controller('indexCtrl', ['$rootScope','$scope',function($rootScope, $scope){ 
    $rootScope.$on("toindexCtrl", function (e) { 
     $scope.$apply(function() { 
      $scope.title = $rootScope.title; 
     }); 
    }); 
}]) 

app.controller('secondCtrl', ['$rootScope','$scope', function($rootScope, $scope){ 
    $rootScope.title = 'UFC'; 
    $rootScope.$broadcast('toindexCtrl'); 
}]) 

Dieser Code funktioniert für mich. Ich verwende auch $ broadcast, um zu hören, wenn sich der Wert ändert.

+0

habe ich versucht, es aber kein Glück. Arbeitet nicht für mich. –

+0

rootScope im Header enthalten? etwas wie: app.controller ('secondCtrl', ['$ rootScope', '$ scope', Funktion ($ rootScope, $ scope) {$ rootScope.title = 'UFC'; $ rootScope. $ broadcast ('toindexCtrl');}]) – hendry91

+0

Ja, ich habe es schon gemacht, als ich es versuchte. Warten. Ich werde eine Geige für diesen einen schaffen. –

0

Ich würde empfehlen, es als Daten in Ihrem Routen Definitionen vorbei, genau wie dieser (Sie können, dass Sie waren nicht bewusst, falls tun):

$stateProvider.state("page1", { 
    url: "/page1", 
    data: { 
     title: "Your Title Here" 
    }, 
    views: { 
    } 
}).state("page2", { 
    url: "/page2", 
    data: { 
     title: "Your Other Title Here" 
    }, 
    views: { 

    } 
}) 

Danach Sie es in Ihrem Controller wie folgt verwenden können :

app.controller('indexCtrl', function($state){ //Note that you inject state 
    $scope.pageTitle= $state.data.title; 
} 

Hoffnung funktioniert dies für Sie

Grüße

+0

$ stateProvider .state ('companyData', { url: '/ Armaturenbrett/companyData', templateUrl: 'html/companydata.html', Daten: { titel: 'Firmendaten' }, controller: 'companyDataCtrl' }); TypeError: Kann Eigenschaft "Titel" von undefined nicht lesen –

Verwandte Themen