自动推送数据

Automatically Pushing Data

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

所以假设用户让他命名为 John。约翰决定登录并创建一个新主题。好的,太棒了,只要他点击提交新主题,我就会推送数据,用户可以看到。都好。现在让我们命名另一个名为 Peter 的用户。在 John 发布他的新主题后,Peter 决定登录。所以现在这里是问题。彼得一登录。您看到约翰发布的重复主题!!!?应用程序中也发生了同样的事情。当其他人登录时自动将其推送到我的数据库。相信我,我做了很多调试和解决问题的工作。但无法弄清楚这个案子。我在这里请求帮助。所以我在这里编写实际代码:

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源数据图片:

最后我改成那个错误时遇到的错误:

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)

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

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