2016-04-25 7 views
0

Ich denke, es ist eine ziemlich neue Frage, aber ich kann es selbst nicht herausfinden. Ich habe Schwierigkeiten, einen eckigen Dienst zu erstellen, der es mir erlaubt, ein Objekt einmal mit den Anfangswerten zu initiieren, und dann könnten andere Controller diese Instanz verwenden. Momentan funktionieren der Getter/Setter nicht. Außerdem wird controller2 aufgerufen, bevor das Objekt erstellt wird.Deklarieren von Angular Service mit neuer Instanz

Wie soll ich diesen Service richtig schreiben?

Seite (Basis) Controller:

vm.user = userService.createNewUser(data); /// init with data 

Sub Seite Controller1:

vm.user.userInfo = userService.getUserInfo(); /// getter 

Sub Seite Controller2:

userService.setUserInfo(data); /// setter 

Service:

(function() { 
    'use strict'; 

    angular 
     .module('app.user') 
     .factory('userService', userService); 

    function userService() { 
     return { 
      createNewUser: function (data) { /// init only once 
       return new User(data); 
      }, 
      getUserInfo: function() { 
       return User.getUserInfo(); 
      }, 
      setUserInfo: function (customer) { 
       return User.setUserInfo(customer); 
      } 
     }; 



    function User(data) { /// ctor 
       this.XXXX = { 
       user_code: data.customer.user_code, 
       user_password: data.customer.user_password 
       }; 
       this.YYYY = { 
       //// some vars 
       } 

     User.prototype = { 
      getXXXXUserInfo: function() { 
       return this.XXXX; 
      }, 
      setXXXXUserInfo: function (customer) { 
       this.XXXX.user_code = customer.user_code; 
       this.XXXX.user_password = customer.user_password; 
      } 
     }; 
    } 
})(); 

Antwort

2
function userService() { 
    return { 
     user:null, 
     createNewUser: function (data) { /// init only once 
      // check for null here if you don't want to be able to only more than once 
      this.user = new User(data); 

     }, 
     getUserInfo: function() { 
      this.user.getUserInfo(); 
     }, 
     setUserInfo: function (customer) { 
      this.user.setUserInfo(customer); 
      // i removed the return since User.setUserInfo is nt returning anything 

     } 
    }; 



function User(data) { /// ctor 
      this.XXXX = { 
      user_code: data.customer.user_code, 
      user_password: data.customer.user_password 
      }; 
      this.YYYY = { 
      //// some vars 
      } 

    User.prototype = { 
     getXXXXUserInfo: function() { 
      return this.XXXX; 
     }, 
     setXXXXUserInfo: function (customer) { 
      this.XXXX.user_code = customer.user_code; 
      this.XXXX.user_password = customer.user_password; 
     } 
    }; 
} 
+0

Es scheint, dass getUserInfo aufgerufen wird, bevor Objekt erstellt wird (createNewUser). Wie kontrolliere ich das? – badigard

+0

Am besten wäre es, vm.user = userService.createNewUser (data) zu haben; /// init mit Daten in einem angular.run-Block. winkel wird nur einmal und vor jedem Controller ausgeführt. – Walfrat

+0

wird dies überprüfen. Danke – badigard

0

Das Problem ist, dass Sie return eine Instanz von User. Sie müssen die Benutzerinstanz zuerst im Dienst speichern und dann zurückgeben.

angular 
    .module('app.user') 
    .factory('userService', userService); 

function userService() { 
    var user; // prepare space in the service for the user instance 

    return { 
     createNewUser: function (data) { 
      return user = new User(data); // user is now saved in the userService service 
     }, 
     ... 
    }; 

    .... 
+0

Danke, aber jetzt kann ich es nicht testen, wie controller2 aufgerufen wird, bevor das Objekt erstellt wird. Wie ändere ich die Bestellung? – badigard

+0

siehe die aktualisierte Antwort. Wenn Sie Daten zwischen mehreren Controllern freigeben möchten, müssen Sie das Benutzerobjekt über der return-Anweisung haben – Ozrix