2015-07-01 25 views
2

我在工廠內有一個用戶變量,在切換控制器後不斷變得不確定。我在一個控制器中設置變量。當我登錄用戶它出現與我期待的數據,但是當我切換控制器和檢索變量它再次未定義。下面是代碼:AngularJS工廠變量不確定

discussionBoard.factory('userFactory', function($http){ 

    console.log("I'm loading the userFactory"); 

    var user = {}; 

    var factory = {}; 

    factory.createUser = function(user, callback){ 
     $http.post('/users/new', {user: user}) 
      .success(function(response){ 
       user = response[0]; 
       callback(user); 
      }) 
    } 

    factory.retrieveUser = function(callback){ 
     callback(user); 
    } 

    console.log(user); 

    return factory; 

}); 

discussionBoard.controller('dashCtrl', function($scope, topicFactory, userFactory){ 

    $scope.createTopic = function(){ 
     topicFactory.createTopic(function(topic){ 
      $scope.topic = topic; 
     }) 
    } 

    userFactory.retrieveUser(function(user){ 
     $scope.user = user; 
    }); 

}); 

編輯:經過更多的實驗,我能得到這個通過增加用戶的工廠對象中的對象的工作。然而,這實際上引發了另一個問題,但是,工廠如何與AJAX進行交互,就像.success()無法訪問工廠的範圍。下面是工作的代碼,但我很好奇,如果任何人都可以說,這是爲什麼以這種方式設置:由同名給予的createUser函數中的參數

discussionBoard.factory('userFactory', function($http){ 

    var factory = {}; 

    factory.createUser = function(user, callback){ 
     $http.post('/users/new', {user: user}) 
      .success(function(response){ 
       factory.user = response[0]; 
       callback(factory.user); 
      }) 
    } 

    factory.user = {}; 

    factory.retrieveUser = function(callback){ 
     callback(factory.user); 
    } 

    return factory; 

}); 

discussionBoard.controller('dashCtrl', function($scope, topicFactory, userFactory){ 

    $scope.createTopic = function(){ 
     topicFactory.createTopic(function(topic){ 
      $scope.topic = topic; 
     }) 
    } 

    userFactory.retrieveUser(function(user){ 
     $scope.user = user; 
    }); 

}); 
+0

創建一個單例服務。這裏是鏈接(描述4種不同的方式在AngularJS中創建單例):http://blog.jdriven.com/2013/03/how-to-create-singleton-angularjs-services-in-4-different-ways/ – Tomislav

回答

2

你的陰影你的工廠的user變量。

var user = {}; // <- this is going to be shadowed! 

var factory = {}; 

factory.createUser = function(user, callback){ //<- note the user argument! 
    $http.post('/users/new', {user: user}) 
     .success(function(response){ 
      user = response[0]; 
      callback(user); 
     }) 
} 

所以當成功回調將user,發現這個名字,這是的createUser功能的帕拉姆最接近變量。否則,這兩種方法都是完全正確的 - 事實上,如果您想讓用戶字段只能通過getter訪問(第二種情況,如果注入工廠,任何控制器都可以直接引用用戶),則第一種方法會更好。