2016-11-12 4 views
0

Ich schrieb das folgende Werk:AngularJS Fabriken - Zugang private Variablen von Methoden

.factory('UserFact', function() { 
    var user = []; 
    return { 
    'setUser': function(user) { 
    this.user = user; 
     console.log('(1) User set: ' + this.user); 
     console.log('(2) User id is now: ' + this.user.uid); 
    }, 
    'updateSport': function(sportid) { 
    console.log('(3)Update sport ' + sportid + 'for user id ' + this.user.uid); 
    } 
} 

es die folgende Art und Weise in meinem Controller verwenden:

function ($scope, $stateParams, DatabaseFact, UserFact) { 

    // variables 
    $scope.sports = []; 
    $scope.sports = DatabaseFact.getSports(); 

    // functions 
    $scope.updateSport = UserFact.updateSport; 

    // execution 
    UserFact.setUser({uid: '123456', name: 'forrest'}); 
} 

und löst es aus meiner Sicht durch eine Liste von Auslöserknopf:

Mein Problem ist, dass Konsolenprotokolle Folgendes drucken:

(1) User set: [Object] Object 
(2) User id is now: 123456 
(3) Update sport 1 for user id undefined 

Wissen Sie, warum meine Benutzer-ID in Protokoll 3 nicht definiert ist?

Dank

Antwort

0

Ich weiß nicht, wie vertraut Sie mit JavaScript, aber ich vermute, dass Sie gefangen sind durch Die this Referenz unterscheidet sich in Ihren beiden Funktionsaufrufen.

Um dies zu debuggen versuchen Sie this auf die Konsole in beiden Funktionen zu protokollieren. Sie sollten beachten, dass sie sich unterscheiden, was die Ursache Ihres Problems erklärt.

Die Fehlerbehebung könnte sein, das Schlüsselwort this nicht zu verwenden, z. setUser Funktion würde:

'setUser': function(_user) { 
    user = _user; 
} 

Sie weitere Informationen über JS this auf Google finden können, versuchen https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this für einen Start.

+0

Ich komme aus C++ und Java. Ich habe wirklich Schwierigkeiten mit Scopes in Javascript, die viel schwieriger zu verstehen in JS ... –

0

Es ist nicht definiert, weil Ihre Funktion this verwendet, wird aber von seinem ursprünglichen Objekt (der Benutzer-Service) auf den Umfang kopiert.

Sie können entweder aufhören this, zu verwenden und stattdessen die user Variable, die Sie deklariert und auf ein leeres Array initialisiert (warum, BTW?), Aber nie irgendwo anders verwendet wird, oder tun

$scope.updateSport = function() { 
    UserFact.updateSport; 
} 

Hinweis dass du deinen Dienst "UserFact" genannt hast, aber es ist kein Geschäft. Es schafft nichts. Es erlaubt nur, einen Benutzer einzustellen und seinen Sport zu aktualisieren. Das ist keine Fabrik. Eine Fabrik ist ein Objekt, mit dem Dinge erschaffen werden. Die Factory ist hier die Funktion, die an module.factory() übergeben wird und die zum Erstellen und Zurückgeben der Dienstinstanz verwendet wird, die besser UserService heißen sollte.

+0

Ich komme aus C++ und ich werde verwendet, um Variablen des Typs zu initialisieren, die sie werden; Hier ist der Benutzer ein Array. Sie empfehlen noch etwas?Außerdem konnte ich keine nachvollziehbare Erklärung für den wahren Unterschied zwischen Factory und Service finden? Irgendein Vorschlag? –

+0

Ein Dienst wird von Controllern und anderen Diensten verwendet. Dienste werden von eckigen in andere Dienste, Controller, Direktiven usw. injiziert. Das Objekt mit seinen beiden Methoden setUser() und updateSport() ist der Dienst. Die Funktion, die Sie an die Funktion factory() übergeben, ist die Factory: Sie erstellt und gibt den Service zurück. Und da Sie 'UserFact.setUser ({uid: '123456', Name: 'forrest'});' aufrufen, ist der Benutzer kein Array. Es ist ein Objekt. –

1

Das macht für mich Sinn, aus dem Grund seiner Implementierung. In Ihrem Controller kopieren Sie den Methodenverweis tatsächlich in $ scope.updateSport. Wann immer die Methode ausgeführt wird, wird sie also im Kontext des Controllers und dieser -> $ scope-Instanz ausgeführt, aber nicht als eine der Dienstinstanzen.

Da Ihr Controller doidst UID hat, gibt es nur undefined zurück.

Um dies zu beheben, müssen Sie eine Methode Körper für updateSort haben und rufen UserFact.updateSport

$scope.updateSport = function(){ 
    UserFact.updateSport(); 
} 
Verwandte Themen