好的伙计们你好。这里的问题是......让我在案例中解释一下(顺便说一句,我正在建立一个论坛):
因此,让我们说用户可以将他命名为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);
最后,当我改变时,我面临的错误:
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)
答案 0 :(得分:2)
此代码唯一真正的问题(编辑前问题的第一个示例文件)是执行mdModal
的代码,也会触发提交操作。将逻辑分成实际的不同控制器,而不是使用匿名函数来定义它们,这是明智的。
在建议将其提取到单独的控制器中之后的给定示例中,authHomeCtrl
中的模态控制器定义缺少newTopicCtrl
周围的引号,这会引发抛出的异常。简单的错字问题。