自动推送数据

时间:2016-04-16 23:01:35

标签: javascript angularjs firebase angularfire

好的伙计们你好。这里的问题是......让我在案例中解释一下(顺便说一句,我正在建立一个论坛):

因此,让我们说用户可以将他命名为John。 John决定登录并制作一个新主题。好的,一旦他点击提交新主题我就推送数据,用户可以看到。都好。现在让我们命名另一个叫Peter的用户。在John发布他的新主题之后,Peter决定登录。所以现在这里是问题。就像PETER一样登录。你看到john发布的重复主题!!!?在应用程序中也发生了同样的事情。当其他人登录时,AUTOMATICALLY将其推送到我的数据库。相信我,我做了很多调试和问题解决。但无法弄清楚这个案子。我在这里请求帮助。所以我在这里编写实际代码:

https://ide.c9.io/amanuel2/fourm2

所以我们可以在那里聚会,看看代码和结果。这也是我的AuthHomeCtrl.js发生此事件(根据我的调试):

(function(angular) {
    var app = angular.module('ForumApp');

    app.controller('authHome', ["$scope", "$firebaseObject", "$state", "$mdDialog", "$mdMedia", "$firebaseArray", function($scope, $firebaseObject, $state, $mdDialog, $mdMedia, $firebaseArray) {
        //Debugging...
        // $state.go('authHome.desc')
        var ref = new Firebase('https://uniquecodersforum.firebaseio.com/')

        var auth = ref.getAuth() ? console.log() : $state.go("home")



        ref.onAuth(function(authData) {

            var obj = $firebaseObject(ref.child("UserAuthInfo").child(authData.uid));
            obj.$loaded(function(data) {
                    console.log(data)
                    $scope.Username = data.Username;
                    $scope.Email = data.Email;
                    $scope.UID = authData.uid;
                    $scope.image = data.Image;
                },
                function(error) {
                    console.error("Error:", error);
                }
            );

        })

        $scope.openMenu = function($mdOpenMenu, ev) {
            //DEBUGING
            console.log("IS IN MD-OPEN MENU FUNCTION")
            $mdOpenMenu(ev);
        }

        $scope.logout = function() {
            //DEBUGING
            console.log("IS IN MD-OPEN LOGOUT FUNCTION")
            $state.go("home");
            window.location.href = "#home"
            ref.unauth();
            location.reload(true);
            location.reload(true);
        }


        $scope.showNewTopic = function(ev) {
            if (ev) {


                var useFullScreen = ($mdMedia('sm') || $mdMedia('xs')) && $scope.customFullscreen;
                $mdDialog.show({
                        controller: function($scope, $mdDialog) {
                            var ref = new Firebase('https://uniquecodersforum.firebaseio.com/')
                            $scope.hide = function() {
                                $mdDialog.hide();
                            };
                            $scope.cancel = function() {
                                $mdDialog.cancel();
                            };
                            $scope.answer = function(answer) {
                                $mdDialog.hide(answer);
                            };
                            $scope.submitNewTopic = function(title, sentence) {
                                console.log(title, sentence)
                                ref.onAuth(function(authData) {
                                    ref.child("UserAuthInfo").child(authData.uid).on("value", function(snapshot) {
                                        $scope.userAvatar = snapshot.val().Image;
                                        $scope.userName = snapshot.val().Username;
                                        $scope.userEmail = snapshot.val().Email;
                                    })
                                    ref.child("Topics").push({
                                        Title: title,
                                        Value: sentence,
                                        DateCreated: Date.now(),
                                        Username: $scope.userName,
                                        Email: $scope.userEmail,
                                        Avatar: $scope.userAvatar,
                                        UID: authData.uid
                                    })
                                })
                                $mdDialog.hide();
                            }
                        },
                        templateUrl: 'views/newTopic.html',
                        parent: angular.element(document.body),
                        targetEvent: ev,
                        clickOutsideToClose: true,
                        fullscreen: useFullScreen
                    })
                    .then(function(answer) {
                        $scope.status = 'You said the information was "' + answer + '".';
                    }, function() {
                        $scope.status = 'You cancelled the dialog.';
                    });

            }

            else {


            }
        }




    }])

})(angular);

非常感谢帮助!谢谢你的阅读。

修改

好的,这是解决@Varel问题。他说有一个控制器和一个函数内部就是很多(对于连续的三个函数)。所以我提取了它......让我们看看:

的index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>Unique Coders</title>

  <!-- Javascript Libraries -->
  <script src="bower_components/jquery/dist/jquery.js"></script>
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
  <script src="bower_components/angular-material/angular-material.js"></script>
  <script src="bower_components/angular-animate/angular-animate.js"></script>
  <script src="bower_components/angular-aria/angular-aria.js"></script>
  <script src="bower_components/angular-messages/angular-messages.js"></script>
  <script type="text/javascript" src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-114/svg-assets-cache.js"></script>
  <script src="bower_components/firebase/firebase.js"></script>
  <script src="bower_components/angularfire/dist/angularfire.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.1/js/materialize.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/angular-material-icons/0.7.0/angular-material-icons.min.js"></script> 
  <script src="node_modules/alertifyjs/build/alertify.js"></script>

  <!-- Styles -->
  <link rel="stylesheet" href="bower_components/angular-material/angular-material.css"/>
  <link rel="stylesheet" href="node_modules/alertifyjs/build/css/alertify.css" />
  <link rel="stylesheet" href="node_modules/alertifyjs/build/css/themes/default.min.css" />
  <link rel="icon shortcut" href="views/assets/images/favicon.ico">

  <!-- Controllers And App -->
  <script type="text/javascript" src="script.js"></script>
  <script type="text/javascript" src="router/mainRouter.js"></script>
  <script type="text/javascript" src="controllers/homeCtrl.js"></script>
  <script type="text/javascript" src="controllers/newTopicCtrl.js"></script>
  <script type="text/javascript" src="controllers/authDescCtrl.js"></script>
  <script type="text/javascript" src="controllers/topicCtrl.js"></script>
  <script type="text/javascript" src="controllers/loginCtrl.js"></script>
  <script type="text/javascript" src="controllers/authHomeCtrl.js"></script>
  <script type="text/javascript" src="controllers/registerCtrl.js"></script>
  <script type="text/javascript" src="controllers/topicCtrl.js"></script>
</head>
<body ng-app="ForumApp">
    <div id="page">
        <div ui-view>

        </div>
    </div>
</body>
</html>

authHomeCtrl.js:

(function(angular) {
    var app = angular.module('ForumApp');

    app.controller('authHome', ["$scope", "$firebaseObject", "$state", "$mdDialog", "$mdMedia", "$firebaseArray", function($scope, $firebaseObject, $state, $mdDialog, $mdMedia, $firebaseArray) {
        // $state.go('authHome.desc')
        var ref = new Firebase('https://uniquecodersforum.firebaseio.com/')

        var auth = ref.getAuth() ? console.log() : $state.go("home")



        ref.onAuth(function(authData) {

            var obj = $firebaseObject(ref.child("UserAuthInfo").child(authData.uid));
            obj.$loaded(function(data) {
                    console.log(data)
                    $scope.Username = data.Username;
                    $scope.Email = data.Email;
                    $scope.UID = authData.uid;
                    $scope.image = data.Image;
                },
                function(error) {
                    console.error("Error:", error);
                }
            );

        })

        $scope.openMenu = function($mdOpenMenu, ev) {
            //DEBUGING
            console.log("IS IN MD-OPEN MENU FUNCTION")
            $mdOpenMenu(ev);
        }

        $scope.logout = function() {
            //DEBUGING
            console.log("IS IN MD-OPEN LOGOUT FUNCTION")
            $state.go("home");
            window.location.href = "#home"
            ref.unauth();
            location.reload(true);
            location.reload(true);
        }


        $scope.showNewTopic = function(ev) {
            if (ev) {


                var useFullScreen = ($mdMedia('sm') || $mdMedia('xs')) && $scope.customFullscreen;
                $mdDialog.show({
                        controller: newTopicCtrl,
                        templateUrl: 'views/newTopic.html',
                        parent: angular.element(document.body),
                        targetEvent: ev,
                        clickOutsideToClose: true,
                        fullscreen: useFullScreen
                    })
                    .then(function(answer) {
                        $scope.status = 'You said the information was "' + answer + '".';
                    }, function() {
                        $scope.status = 'You cancelled the dialog.';
                    });

            }

            else {


            }
        }




    }])

})(angular);

NewTopicCtrl.js:

(function(angular) {
    var app = angular.module('ForumApp')

    app.controller('newTopicCtrl', ["$scope", "$mdDialog", function($scope,$mdDialog) {
        var ref = new Firebase('https://uniquecodersforum.firebaseio.com/')
        $scope.hide = function() {
            $mdDialog.hide();
        };
        $scope.cancel = function() {
            $mdDialog.cancel();
        };
        $scope.answer = function(answer) {
            $mdDialog.hide(answer);
        };
        $scope.submitNewTopic = function(title, sentence) {
            console.log(title, sentence)
            ref.onAuth(function(authData) {
                ref.child("UserAuthInfo").child(authData.uid).on("value", function(snapshot) {
                    $scope.userAvatar = snapshot.val().Image;
                    $scope.userName = snapshot.val().Username;
                    $scope.userEmail = snapshot.val().Email;
                })
                ref.child("Topics").push({
                    Title: title,
                    Value: sentence,
                    DateCreated: Date.now(),
                    Username: $scope.userName,
                    Email: $scope.userEmail,
                    Avatar: $scope.userAvatar,
                    UID: authData.uid
                })
            })
            $mdDialog.hide();
        }

    }])
})(angular);

显示源数据GET的图片: enter image description here

最后,当我改变时,我面临的错误:

error:angular.js:13424 ReferenceError: newTopicCtrl is not defined at Scope.$scope.showNewTopic (authHomeCtrl.js:52) at fn (eval at compile (angular.js:14268), <anonymous>:4:331) at expensiveCheckFn (angular.js:15281) at callback (angular.js:24808) at Scope.$eval (angular.js:17025) at Scope.$apply (angular.js:17125) at HTMLButtonElement.<anonymous> (angular.js:24813) at HTMLButtonElement.dispatch (jquery.js:4737) at HTMLButtonElement.elemData.handle (jquery.js:4549)

1 个答案:

答案 0 :(得分:2)

此代码唯一真正的问题(编辑前问题的第一个示例文件)是执行mdModal的代码,也会触发提交操作。将逻辑分成实际的不同控制器,而不是使用匿名函数来定义它们,这是明智的。

在建议将其提取到单独的控制器中之后的给定示例中,authHomeCtrl中的模态控制器定义缺少newTopicCtrl周围的引号,这会引发抛出的异常。简单的错字问题。