2016-05-15 6 views
1

Ich glaube, ich etwas über $ scope fehle. Ich habe einige NG-Hide/Shows, die eine Variable in einem Top-Nav haben. Innerhalb einer NG-Ansicht, die über die App-Konfigurationsfunktion mit Controllern verbunden ist. Mein Nav-Code befindet sich in "NavController". Aber ich habe eine Seite in einer Ansicht außerhalb des Navigationsbereichs, die mit "AppointmentController" verknüpft ist und den Code ausführt, der sich um das Festlegen eines Termins kümmert. Nachdem Sie einige Schritte durchlaufen haben, können Sie sich anmelden, dieser Code ist innerhalb der AppointmentController-Ansicht, aber ich habe dies getan -

EDIT - Ich habe gerade festgestellt, die Eingabe unten muss in einem separaten Controller sein. Wenn ich es an den NavController anschließe, möchte ich, dass appTLogin() die Hauptansichtsdaten ändert, die alle in einem separaten Controller sind.

<input ng-controller="NavController" ng-click="apptLogin(email)" value="Login and Continue" class="btn btn-default pull-left" > 

$scope.apptLogin = function(email){ 
    $http({ 
    method: 'POST', 
    data: {email: email}, 
    url: '/common_includes/ajax/validateUser.php', 
    }).then(function successCallback(response) { 
     if(response.data.status == 0){ 
     var login_message = '<div class="alert alert-danger" role="alert">'+response.data.message+'</div>'; 
     $('#login_modal .modal-body').html(login_message); 
     $('#login_modal').modal(); 
     $interval(function(){ 
      $('#login_modal').modal('hide'); 
     }, 1400, 1); 
     } 
     if(response.data.status == 1){ 
     $scope.appt_history = true; 
     console.log($scope); 
     var login_message = '<div class="alert alert-success" role="alert">'+response.data.message+'</div>'; 
     $('#login_modal .modal-body').html(login_message); 
     $('#login_modal').modal(); 
     $interval(function(){ 
      $scope.click_login = false; 
      $('#login_modal').modal('hide'); 
     }, 1400, 1); 
     } 

Der Code läuft alle. Diese Zeile hier ist, was die Ausblendung/einblenden sollte, aber es ist nicht. -

$scope.appt_history = true; 

Wenn ich verwirrt bin zwar, weil, wenn console.log ($ scope) nach der obigen Linie, ich sehe alle NavController Variablen und $ scope.appt_history ist == wahr, noch hide/show nicht zu ändern . Was fehlt mir hier?

+0

Somit fixiert das Problem jetzt? – Matthias

+0

Nein ... Ich habe Elemente in diesem Nav, die alle an einen Controller angeschlossen sind ... Ich dachte, dass alles in diesem Bereich stattfinden würde. Aber jetzt brauche ich eine Schaltfläche, die an einen anderen Controller angeschlossen ist, um eine show/hide-Variable zu ändern, die sich im Nav-Controller befindet. Grundsätzlich zwei Controller mit unterschiedlichen Bereichen. Ich weiß, das sollte vielleicht mit einem "Service" gemacht werden, aber nicht sicher, wie man es in diesem speziellen Fall benutzt. –

+0

Ganz nebenbei kann die Verwendung von JQuery zum Anzeigen/Verbergen von Material zu seltsamen Scoping-Problemen in angular führen. Sie müssen möglicherweise $ $ scope. $ Apply 'viele Dinge, um Dinge in eckigen Umfang zu bekommen. Ich empfehle die Verwendung von benutzerdefinierten Direktiven für Modals oder UI-Bootstrap, da es viele dieser JQuery in ein winkelfertiges Formular umschließt. – ryanyuyu

Antwort

1

Der einfache Weg wäre $ rootScope in beiden Controllern zu injizieren und die gemeinsamen Daten Eigenschaften dort statt in $ Rahmen zu setzen, aber dies ist nicht der empfohlene Weg, Dinge zu tun.

jedoch empfehle ich stattdessen einen Dienst. Sie sind einfach zu schreiben und machen die gemeinsame Nutzung von Daten über Controller hinweg zu einem Kinderspiel, ohne den Wurzelbereich zu belasten.

Grundsätzlich Sie zuerst Ihren Dienst erstellen und fügen Sie die Eigenschaft, die Sie

app.service('sharingSvc', function() { 
    this.sharedValue = 'initialized'; 
}); 

nun an den Konstruktor teilen möchten, können Sie diesen Service in die Steuerungen injizieren, die Zugriff auf Ihre gemeinsamen Grundstück benötigen.

app.controller('pageOneCtrl', function($scope, sharingSvc) { 
    $scope.pageOneSare = sharingSvc; 
}); 

Here is a complete, but very basic Plnkr, die zeigt, wie Daten über mehrere Controller und Ansichten mit einem Service zu teilen. Dies sollte genug sein, um Sie zu beginnen. Hoffentlich hilft dir das weiter!

+0

Sieht gut aus. Ich habe Dienste verwendet, um Daten oft aus einer Datenbank hin- und herzuschicken, aber das ist alles, wofür ich sie bisher benutzt habe. Ich werde es versuchen und meinen Code posten. Vielen Dank. –

Verwandte Themen