2015-07-01 2 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; 
    }); 

}); 

EDIT: После того, как немного больше экспериментировать, я был в состоянии получить эту работу путем добавления пользователя в качестве объекта в пределах объекта фабрики. Однако на самом деле возникает еще один вопрос о том, как здесь взаимодействует фабрика с AJAX, поскольку, кажется, .success() не имеет доступа к области завода. Вот код, который работал, но я бы интересно, если кто-то может сказать, почему это устроено таким образом:

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

Создайте услугу Singleton. Вот ссылка (описать 4 разных способа создания singleton в AngularJS): http://blog.jdriven.com/2013/03/how-to-create-singleton-angularjs-services-in-4-different-ways/ – Tomislav

ответ

2

Вы слежка переменную вашей фабрики user давая функцию CreateUser параметр с тем же именем ,

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. В противном случае оба подхода совершенно прекрасны - на самом деле первый из них лучше, если вы хотите, чтобы пользовательское поле было доступно только через геттер (во втором случае любой контроллер мог получить прямую ссылку на пользователя, если завод вводится).

Смежные вопросы