Javascript 自动推送数据
好的,伙计们,你好。这里的问题是。。让我在一个案例中解释一下(顺便说一句,我正在做一个论坛): 所以让我们说,一个用户让他命名为约翰。John决定登录并创建一个新主题。好的,太棒了,只要他点击提交新主题,我就会推送数据,用户可以看到。一切都好。现在让我们命名另一个名为Peter的用户。在John发布新主题后,Peter决定登录。现在是问题所在。彼得一登录就开始。你看到了john发布的重复主题!!!?同样的事情也发生在应用程序中。当其他人登录时,它会自动将其推送到我的数据库。相信我,我做了大量的调试和问题解决。但我想不出是怎么回事。我在这里请求帮助。因此,我在这里对实际代码进行编码: 所以我们可以在那里会面,也可以看到代码和结果。另外,下面是发生此事件的AuthHomeCtrl.js(根据我的调试): 非常感谢您的帮助!谢谢你的阅读 编辑 好的,这是解决@Varel问题。他说,拥有一个控制器和一个函数(对于一行中的三个函数)是非常重要的。所以我提取了它。。。。让我们看看: index.html:Javascript 自动推送数据,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,好的,伙计们,你好。这里的问题是。。让我在一个案例中解释一下(顺便说一句,我正在做一个论坛): 所以让我们说,一个用户让他命名为约翰。John决定登录并创建一个新主题。好的,太棒了,只要他点击提交新主题,我就会推送数据,用户可以看到。一切都好。现在让我们命名另一个名为Peter的用户。在John发布新主题后,Peter决定登录。现在是问题所在。彼得一登录就开始。你看到了john发布的重复主题!!!?同样的事情也发生在应用程序中。当其他人登录时,它会自动将其推送到我的数据库。相信我,我做了大量的调
<!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)