Javascript 自动推送数据

Javascript 自动推送数据,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,好的,伙计们,你好。这里的问题是。。让我在一个案例中解释一下(顺便说一句,我正在做一个论坛): 所以让我们说,一个用户让他命名为约翰。John决定登录并创建一个新主题。好的,太棒了,只要他点击提交新主题,我就会推送数据,用户可以看到。一切都好。现在让我们命名另一个名为Peter的用户。在John发布新主题后,Peter决定登录。现在是问题所在。彼得一登录就开始。你看到了john发布的重复主题!!!?同样的事情也发生在应用程序中。当其他人登录时,它会自动将其推送到我的数据库。相信我,我做了大量的调

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

所以让我们说,一个用户让他命名为约翰。John决定登录并创建一个新主题。好的,太棒了,只要他点击提交新主题,我就会推送数据,用户可以看到。一切都好。现在让我们命名另一个名为Peter的用户。在John发布新主题后,Peter决定登录。现在是问题所在。彼得一登录就开始。你看到了john发布的重复主题!!!?同样的事情也发生在应用程序中。当其他人登录时,它会自动将其推送到我的数据库。相信我,我做了大量的调试和问题解决。但我想不出是怎么回事。我在这里请求帮助。因此,我在这里对实际代码进行编码:

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

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

编辑 好的,这是解决@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>
newtopictrl.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);
显示获取的源数据的图片:

最后,当我改成这样时,我面临的错误是:

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)
error:angular.js:13424 ReferenceError:newtopictrl未在作用域中定义。$Scope.showNewTopic(authomHomeCtrl.js:52)在fn(编译时求值(angular.js:14268),:4:331)在回调(angular.js:15281)在作用域中定义。$eval(angular.js:17025)在作用域中定义。$apply(angular.js:17125)在HTMLButtonElement中定义。(angular.js:24813)在HTMLButtonElement.dispatch(jquery.js:4737)在HTMLButtonElement.elemData.handle(jquery.js:4549)上

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


在建议将其提取到单独控制器中的给定示例中,
authHomeCtrl
中的模态控制器定义在
newTopicCtrl
周围缺少引号,从而导致引发异常。简单的输入错误问题。

所以您必须能够验证,重复的对象是否会被推送,或者仅仅是呈现代码导致了问题?给定的控制器称为“authHome”,那么它有“showTopic”的方法,其中有“submitNewTopic”功能?很明显这里有些东西真的搞混了。尝试组织代码,使其更具可读性和意义。只给函数一个职责。是@Vaelyr showTopic方法在另一个控制器中。更深入地看它。我还试图将控制器放在另一个文件上,但它给了我很大的时间错误…我只是提取了它,正如你在@Vaelyr上面发布的我的cloud9中看到的那样,我得到了这个错误:angular.js:13424 ReferenceError:newtopictrl没有在Scope中定义。$Scope.showNewTopic(authomectrl.js:52)在fn(eval at compile(angular.js:14268),:4:331)在范围回调时使用expensiveCheckFn(angular.js:15281)(angular.js:24808)。在范围调用时使用$eval(angular.js:17025)。在HTMLButtoneElement调用时使用$apply(angular.js:17125)。(angular.js:24813)在HTMLButtonElement.dispatch(jquery.js:4737)在HTMLButtonElement.elemData.handle(jquery.js:4549)显示和提交是两个完全不同的操作,没有人知道您在这里尝试做什么。如果我看到这样的代码,我不会费心去理解这里发生了什么。把这件事弄清楚你的意图是什么。似乎是一个简单的积垢操作。所以做两个独立的函数,一个用于查看主题,另一个用于发布。首先称之为“TopicController”。身份验证应该存在于一个单独的模块中。好了@Vaelyr我更新了我的问题。现在我不明白为什么我会收到这两个错误。。欢迎使用cloud9ide:是的,他还指导我让我的代码看起来更整洁!顺便说一句,在你离开后,我学到了更多的技巧:D
(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);
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)