Angular 将数据从工厂传递到控制器
Angular passing data from factory to controller
我正在尝试存储一个授权用户 ID 变量,我可以将其传递给控制器。我知道我尝试从工厂对象的闭包内部传递数据的方式存在问题,但我仍然不知道如何修复它。
这是我的工厂:
myApp.factory('Authentication', function($firebase,
$firebaseAuth, FIREBASE_URL, $location) {
var ref = new Firebase(FIREBASE_URL);
var simpleLogin = $firebaseAuth(ref);
var authorized;
var myObject = {
login : function() {
return simpleLogin.$authAnonymously().then(function(authData) {
authorized = authData.uid;
console.log("Logged in as:", authData.uid);
}).catch(function(error) {
console.error("Authentication failed:", error);
});
},
auth : authorized
} //myObject
return myObject;
});
这是我的控制器:
myApp.controller('MeetingsController',
function($scope, $firebase, Authentication) {
var ref = new Firebase('http://i2b2icons.firebaseio.com/');
var meetings = $firebase(ref);
$scope.authid = Authentication.auth;
$scope.meetings = meetings.$asObject();
// $scope.id = = Authentication.login.id;
$scope.addMeeting=function() {
meetings.$push({
name: $scope.meetingname,
date: Firebase.ServerValue.TIMESTAMP
}).then(function() {
$scope.meetingname = '';
});
} //addmeeting
$scope.deleteMeeting=function(key) {
meetings.$remove(key);
} //deletemeeting
}); //MeetingsController
我真的只是想让 $scope.authid 变量从 myObject 的登录函数中获取授权值。
应该已经通过此控制器登录调用了登录方法:
myApp.controller('RegistrationController',
function($scope, $firebaseAuth, $location, Authentication) {
$scope.login = function() {
Authentication.login();
} //login
}); //RegistrationController
您只是在您的工厂中设置局部变量 authorized
,它与您试图在您的控制器中访问的 Authentication.auth
无关(当然,除非您为其设置值在创造因素的同时,无论如何这都不是意图)。取而代之的是 return 工厂中的预定义对象和 return 来自工厂的对象。在对象引用上设置 属性。
myApp.factory('Authentication', function($firebase,
$firebaseAuth, FIREBASE_URL, $location) {
var ref = new Firebase(FIREBASE_URL);
var simpleLogin = $firebaseAuth(ref);
//Predefine the factory
var factory = {
login: login,
authorized: null
};
function login() {
return simpleLogin.$authAnonymously().then(function(authData) {
factory.authorized = authData.uid; //Set the property here
}).catch(function(error) {});
}
//return it
return factory;
});
有了这个,只要您有工厂的引用,对其 属性 的更新就会反映在您的控制器中(前提是您调用填充数据的方法)。另一种方法是在您的工厂中使用 getter 函数来 return 身份验证对象,或者您也可以缓存由登录函数 return 编辑的承诺和 return 它并在发生注销用户的事件时使其无效。
正如其他人已经指出的,您只更新了变量 authorized
,而不是 属性 auth
。一个相当简单的解决方案是将 auth
更改为 getter,即始终 returns 当前值:
var myObject = {
login : function() {
...
},
get auth() {
return authorized;
}
您无需更改任何其他代码。
我正在尝试存储一个授权用户 ID 变量,我可以将其传递给控制器。我知道我尝试从工厂对象的闭包内部传递数据的方式存在问题,但我仍然不知道如何修复它。
这是我的工厂:
myApp.factory('Authentication', function($firebase,
$firebaseAuth, FIREBASE_URL, $location) {
var ref = new Firebase(FIREBASE_URL);
var simpleLogin = $firebaseAuth(ref);
var authorized;
var myObject = {
login : function() {
return simpleLogin.$authAnonymously().then(function(authData) {
authorized = authData.uid;
console.log("Logged in as:", authData.uid);
}).catch(function(error) {
console.error("Authentication failed:", error);
});
},
auth : authorized
} //myObject
return myObject;
});
这是我的控制器:
myApp.controller('MeetingsController',
function($scope, $firebase, Authentication) {
var ref = new Firebase('http://i2b2icons.firebaseio.com/');
var meetings = $firebase(ref);
$scope.authid = Authentication.auth;
$scope.meetings = meetings.$asObject();
// $scope.id = = Authentication.login.id;
$scope.addMeeting=function() {
meetings.$push({
name: $scope.meetingname,
date: Firebase.ServerValue.TIMESTAMP
}).then(function() {
$scope.meetingname = '';
});
} //addmeeting
$scope.deleteMeeting=function(key) {
meetings.$remove(key);
} //deletemeeting
}); //MeetingsController
我真的只是想让 $scope.authid 变量从 myObject 的登录函数中获取授权值。
应该已经通过此控制器登录调用了登录方法:
myApp.controller('RegistrationController',
function($scope, $firebaseAuth, $location, Authentication) {
$scope.login = function() {
Authentication.login();
} //login
}); //RegistrationController
您只是在您的工厂中设置局部变量 authorized
,它与您试图在您的控制器中访问的 Authentication.auth
无关(当然,除非您为其设置值在创造因素的同时,无论如何这都不是意图)。取而代之的是 return 工厂中的预定义对象和 return 来自工厂的对象。在对象引用上设置 属性。
myApp.factory('Authentication', function($firebase,
$firebaseAuth, FIREBASE_URL, $location) {
var ref = new Firebase(FIREBASE_URL);
var simpleLogin = $firebaseAuth(ref);
//Predefine the factory
var factory = {
login: login,
authorized: null
};
function login() {
return simpleLogin.$authAnonymously().then(function(authData) {
factory.authorized = authData.uid; //Set the property here
}).catch(function(error) {});
}
//return it
return factory;
});
有了这个,只要您有工厂的引用,对其 属性 的更新就会反映在您的控制器中(前提是您调用填充数据的方法)。另一种方法是在您的工厂中使用 getter 函数来 return 身份验证对象,或者您也可以缓存由登录函数 return 编辑的承诺和 return 它并在发生注销用户的事件时使其无效。
正如其他人已经指出的,您只更新了变量 authorized
,而不是 属性 auth
。一个相当简单的解决方案是将 auth
更改为 getter,即始终 returns 当前值:
var myObject = {
login : function() {
...
},
get auth() {
return authorized;
}
您无需更改任何其他代码。