Angular 1.6: 工厂问题初始化值
Angular 1.6: Factory issue initializing values
我有下一个 'problem' 和 Angular 1.
我有这个 Factory 用于获取当前登录用户的数据:
angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, backend_url) {
var authFactory = this;
var user = {};
authFactory.init = function(){
// This API returns the information of the current user
api.current_user.get({}).$promise.then(function(res){
user = res;
});
}
// I use this function to return the user
authFactory.user = function () {
return user;
};
}
这是一个基本的 Controller 示例,我在其中尝试访问上述工厂检索到的信息:
angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
$scope.user = authFactory.user();
authFactory.init();
angular.element(document).ready(function () {
// This will return {} because it's called
// before the factory updates user value
console.log(authFactory.user());
console.log($scope.user);
});
});
问题是 $scope.user = myFactory.user(); 在工厂检索用户值后不会更新。
我认为我的问题与 myFactory.user(); 有关。我正在使用一个函数,所以函数返回的值在 myFactory.user 更改后不会更新,我认为这就是 PageCtrl[=40 上的原因=] 变量 $scope.user 没有得到任何值。
我的问题是:
在我的控制器上等待 authFactory 加载用户信息的最佳方法是什么?
我应该改用服务吗?
angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, backend_url) {
var authFactory = this;
authFactory.user = {}
// I use this function to return the user
authFactory.getUser() = function () {
return api.current_user.get({}).$promise.then(function(res){
authFactory.user = res;
});
};
}
angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
authFactory.getUser().then(function() {
$scope.user = authFactory.user;
});
});
给我们一个JSFiddle,我试着在没有任何测试环境的情况下帮助你。
您的实施存在问题,当 authFactory.init()
被调用时 user
正在初始化,可能使用异步 API。
我建议您 return 通过 authFactory.user
方法承诺。
angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, $q, backend_url) {
var authFactory = this;
var user = {};
authFactory.init = function () {
// This API returns the information of the current user
return api.current_user.get({}).$promise.then(function (res) {
user = res;
});
}
//Return promise from the method
authFactory.user = function () {
var deferred = $q.defer();
if (angular.isDefined(user)) {
deferred.resolve(user);
} else {
authFactory.init().then(function () {
deferred.resolve(user);
});
}
return deferred.promise;
};
});
然后修改控制器
angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
authFactory.user().then(function (user) {
$scope.user = user;
})
});
我有下一个 'problem' 和 Angular 1.
我有这个 Factory 用于获取当前登录用户的数据:
angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, backend_url) {
var authFactory = this;
var user = {};
authFactory.init = function(){
// This API returns the information of the current user
api.current_user.get({}).$promise.then(function(res){
user = res;
});
}
// I use this function to return the user
authFactory.user = function () {
return user;
};
}
这是一个基本的 Controller 示例,我在其中尝试访问上述工厂检索到的信息:
angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
$scope.user = authFactory.user();
authFactory.init();
angular.element(document).ready(function () {
// This will return {} because it's called
// before the factory updates user value
console.log(authFactory.user());
console.log($scope.user);
});
});
问题是 $scope.user = myFactory.user(); 在工厂检索用户值后不会更新。
我认为我的问题与 myFactory.user(); 有关。我正在使用一个函数,所以函数返回的值在 myFactory.user 更改后不会更新,我认为这就是 PageCtrl[=40 上的原因=] 变量 $scope.user 没有得到任何值。
我的问题是:
在我的控制器上等待 authFactory 加载用户信息的最佳方法是什么?
我应该改用服务吗?
angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, backend_url) {
var authFactory = this;
authFactory.user = {}
// I use this function to return the user
authFactory.getUser() = function () {
return api.current_user.get({}).$promise.then(function(res){
authFactory.user = res;
});
};
}
angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
authFactory.getUser().then(function() {
$scope.user = authFactory.user;
});
});
给我们一个JSFiddle,我试着在没有任何测试环境的情况下帮助你。
您的实施存在问题,当 authFactory.init()
被调用时 user
正在初始化,可能使用异步 API。
我建议您 return 通过 authFactory.user
方法承诺。
angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, $q, backend_url) {
var authFactory = this;
var user = {};
authFactory.init = function () {
// This API returns the information of the current user
return api.current_user.get({}).$promise.then(function (res) {
user = res;
});
}
//Return promise from the method
authFactory.user = function () {
var deferred = $q.defer();
if (angular.isDefined(user)) {
deferred.resolve(user);
} else {
authFactory.init().then(function () {
deferred.resolve(user);
});
}
return deferred.promise;
};
});
然后修改控制器
angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
authFactory.user().then(function (user) {
$scope.user = user;
})
});