如何使用Angular

时间:2016-07-13 06:33:18

标签: angularjs firebase firebase-realtime-database angularfire firebase-authentication

我试图通过服务在控制器之间传递数据,但我遇到了麻烦,因为它什么也没有返回。

这是我的服务:

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)">

我做错了什么?是否有更简单的方法在控制器之间传递数据?提前谢谢。

4 个答案:

答案 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;
  })
});

http://jsfiddle.net/adutu/6bo1ojn1/11/

答案 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两者,公开服务的基础数据属性。如果这是可以接受的,您可以放松吸气剂和安装者,直接进入酒店。

example

或者省略savedData并将local/sessionStorage设为您的服务专用,只能在您的服务中访问。

example

修改

这是针对您的服务的潜在问题,但我认为@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; } });