2016-03-21 3 views
2

Gibt es eine Möglichkeit, die Instanz eines Objekts zu überprüfen, das von einer AngularJS Fabrik erstellt wurde?AngularJS get Instanz des Fabrikobjekts

angular.module('so') 
    .factory('UserFac', function() { 
     return function (first, last) { 
      return { 
       name : first + ' ' + last 
      }; 
     } 
    }) 
    .controller('UserCtrl', function (User) { 
     var user = new UserFac('John', 'Doe'); 

     function isUser(userObj) { 
      // your answer here... 
     } 

     if (isUser(user)) { 
      // does not matter 
     } 
    }); 

Leider fand ich keinen Weg, um die Instanz des Factory-Objektes durch die üblichen JavaScript Möglichkeiten, wie zu überprüfen:

user instanceof UserFac 

oder

typeof user === 'UserFac' 

oder

user.constructor === UserFac 

oder

Es sieht aus wie der interne AngularJS-Code für Fabriken/Dienste die Prototyp/Konstruktor-Eigenschaft verbirgt.

Websuche ist ziemlich schmerzhaft, da (die meisten) alle Ergebnisse den Unterschied zwischen einem Service und einer Fabrik betreffen.

Danke für Ihre Hilfe!

Antwort

3

Ein Problem ist, dass Ihre Konstruktorfunktion anonym ist, ein weiteres Problem ist, dass Sie ein Objektliteral sind Rückkehr (, die nicht eine Instanz Ihrer Konstruktorfunktion ist, sondern eine Instanz von Object Konstruktor) von Ihrer Konstruktor-Funktion.

instanceof ordnungsgemäß funktionieren, wenn Sie es tun, wie unten dargestellt:

angular.module('so', []); 
angular.module('so') 
    .factory('UserFac', function() { 
    function UserFac(first, last) { 
    //--------^-- give it the factory name 
     this.name = first + ' ' + last 
    //-^-- use the object created internally using this keyword 
    } 
    return UserFac; 
    }) 
    .controller('UserCtrl', function(UserFac) { 
    var user = new UserFac('John', 'Doe'); 
    console.log(user instanceof UserFac) 
    }); 
+0

Das ist es! Vielen Dank für Ihre schnelle Antwort. Sieht aus wie der Name der Konstruktorfunktion nicht unbedingt benötigt wird und der Hauptpunkt war die Verwendung von "this". Der folgende Code sollte auch den Trick machen: angular.module ('so', []); angular.module ('so') .factory ('UserFac', function() { return (erste, letzte) { this.name = first + '' + zuletzt; // -^- verwenden, die Objekt, das intern mit diesem Schlüsselwort erstellt wurde }; }); –

0

Vereinbaren Sie mit @ T. J. Alternativ können Sie auch wie folgt implementieren.

Sie können ihre documentation, wie tatsächlich Angular Instantiate benannte Anbieter zu lesen. Dies ist eine bewährte Methode, die von der Angular Community selbst definiert wird.

Fiddle Link

Code:

angular.module('so', []); 
angular.module('so') 
    .factory('UserFac', function UserFac() { 
    return function (first, last) { 
     this.name = first + ' ' + last 
    } 
    }) 
    .controller('UserCtrl', function(UserFac) { 
    var user = new UserFac('John', 'Doe'); 
    console.log(user instanceof UserFac) 
    console.log("Name:"+user.name); 
    });