我试图通过服务在控制器之间传递数据,但我遇到了麻烦,因为它什么也没有返回。
这是我的服务:
app.service('myService', function() {
var savedData = "";
return {
get: function () {
//You could also return specific attribute of the form data instead
//of the entire data
return savedData;
},
set: function (data) {
//You could also set specific attribute of the form data instead
this.savedData = data;
}
};
});
这是控制器使用名为goToAccount()的函数保存数据:
app.controller("chatController", ["$scope", "$firebaseArray", "Auth", "$window", "$state", "myService",
function($scope, $firebaseArray, Auth, $window, $state, myService) {
$scope.message = 'ChatRoom';
$scope.auth = Auth;
$scope.auth.$onAuthStateChanged(function(firebaseUser) {
$scope.firebaseUser = firebaseUser;
console.log("Name: "+firebaseUser.displayName + "," + firebaseUser.email);
firebaseUser.providerData.forEach(function (profile) {
console.log("Sign-in provider: "+profile.providerId);
console.log(" Provider-specific UID: "+profile.uid);
console.log(" Provider Name: "+profile.displayName);
console.log(" Provider Email: "+profile.email);
console.log(" Provider Photo URL: "+profile.photoURL);
user = profile;
});
});
var ref = firebase.database().ref().child("messages");
// create a synchronized array
$scope.messages = $firebaseArray(ref);
// add new items to the array
// the message is automatically added to our Firebase database!
$scope.addMessage = function() {
$scope.messages.$add({
user: user.displayName,
email: user.email,
text: $scope.newMessageText
});
};
$scope.goToAccount = function(email){
myService.set(email);
console.log(" Email: "+email);
$window.location.href = "/account.html"
}
}
]);
这是获取数据的控制器。 myService.get()返回空格:
app.controller("accountCtrl", ["$scope", "Auth", "$window", "$state", "$stateParams", "myService",
function($scope, Auth, $window, $state, $stateParams, myService) {
console.log(myService.get());
$scope.message = 'Account Page for id' + myService.get();
}
]);
使用ng-click在html中触发goToAccount函数:
<a ng-click="goToAccount(message.email)">
我做错了什么?是否有更简单的方法在控制器之间传递数据?提前谢谢。
答案 0 :(得分:2)
有多种方法可以在控制器或组件之间共享数据。
其中一些人正在使用服务,$ rootScope,事件,本地存储
我将举几个例子
与以下人士共享数据: 的 $ rootScope 强>
module.controller('Controller5a',function($scope,$rootScope) {
$scope.shared='hello';
$scope.$watch('shared',function(newValue){
$rootScope.shared=$scope.shared
})
});
module.controller('Controller5b', function($scope,$rootScope) {
$scope.shared=''
$rootScope.$watch('shared',function(newValue){
$scope.shared=$rootScope.shared;
})
});
http://jsfiddle.net/adutu/rs4tg6qx/41/
不推荐这样做,因为您正在污染$ rootScope
与以下人士共享数据: 的服务强>
因为服务和工厂都是单身,所以你可以这样做
module.service('Share', function(){
return { text: 'hello' };
});
module.controller('Controller5a',function($scope, Share) {
$scope.Share = Share
});
module.controller('Controller5b', function($scope, Share) {
$scope.Share = Share
});
http://jsfiddle.net/adutu/rs4tg6qx/55/与工厂合作 http://jsfiddle.net/adutu/osd0sm9q/有服务
如果您想在此示例中使用服务而不是工厂,只需将工厂更改为服务即可完成:)
或使用set和get
module.factory('Share', function(){
var text ='hello';
return {
get: function(){
return text;
},
set: function(value){
text=value;
console.log(text);
},
value:text
};
});
module.controller('Controller5a',function($scope, Share) {
$scope.text = Share.get();
$scope.set = function(){
Share.set($scope.text);
}
});
module.controller('Controller5b', function($scope, Share) {
$scope.Share = Share;//to bind
//use $scope.text = Share.get() //not to bind
});
http://jsfiddle.net/adutu/s9obvz57/1/
与以下人士共享数据: 使用活动
module.controller('Controller5a',function($scope) {
$scope.text='hello';
$scope.$watch('text',function(newValue,oldValue){
//console.log(newValue);
//this with send the message to $rootScope
$scope.$emit('share',$scope.text);
})
});
module.controller('Controller5b', function($scope,$rootScope) {
$rootScope.$on('share', function(event,response){
console.log(response);
$scope.text = response;
})
});
答案 1 :(得分:1)
所以你遇到了一个范围与上下文问题。我试着解释
setter
set: function(data) {
this.savedData = data;
},
正在查看您的服务上下文,或者您自己查找属性savedData
的服务。如果在服务方法中使用this
,它将在您的服务本身上公开该属性。因此,您可以使用myService.savedData
在控制器中访问它,或者甚至在那里设置它。
吸气者:
get: function() {
return savedData;
}
只是引用一个正常的变量,如果它的闭合或词汇范围(倾向于lexcial)使得这个工作的话,我的头顶不太确定。任何方式JavaScript都会首先在set
savedData
方法中查看var savedData = "";
如果找不到它,它将会回到最初设置savedData
的服务声明的状态改为使用那个变量。
因此,您可以看到您的服务为每种方法使用了两种不同的this
。
您应该使用this
两者,公开服务的基础数据属性。如果这是可以接受的,您可以放松吸气剂和安装者,直接进入酒店。
或者省略savedData
并将local/sessionStorage
设为您的服务专用,只能在您的服务中访问。
修改
这是针对您的服务的潜在问题,但我认为@MMhunter可能会对他的评论有所了解。您说当您正确实施服务时,它仍然无法正常工作。然而,在设置服务值后,您将重定向到另一个页面。如果您没有在该页面上重新加载您的应用状态,那么您的角度应用将重启&#39;在新页面加载丢失服务中的所有数据集。像这样工作的单页应用程序不会重新加载整个页面,它们使用部分和url哈希加载新的部分,这意味着整个页面不会重新加载,因此您的应用程序不会重新加载失去状态。还有一种方法可以让您的应用在页面加载和使用<<
之间保持其状态。不知道你的应用程序其余部分的设计,所以可能不适合。
答案 2 :(得分:0)
您的服务有拼写错误
app.service('myService', function() {
var savedData = '';
return {
get: function () {
//You could also return specific attribute of the form data instead
//of the entire data
return savedData;
},
set: function (data) {
//You could also set specific attribute of the form data instead
savedData = data;
}
};
});
您在this.savedData
设置了值,但是您将其声明为var
,并且您将返回""
的savedData。
答案 3 :(得分:0)
如果您正在使用服务服务,那么它始终只返回数组。
DevsActivity
了解和了解有关服务的信息youtube video
在 chatController
中这样做是为了检查它是否正常工作
final String randomCode = UUID.randomUUID().toString();
// or you can play with the len...
final String randomCode2 = UUID.randomUUID().toString().substring(0, 5);
在 accountCtrl
中此处尝试在alert
中返回值welcome app.service('myService', function() {
var savedData = [];
this.getsavedData = function () {
//You could also return specific attribute of the form data instead
//of the entire data
return savedData;
}
this.setsavedData = function (data) {
//You could also set specific attribute of the form data instead
savedData = data;
}
});