您好我正在开发一个项目,我有一个订阅/取消订阅通知按钮。我在此按钮上使用bootstrap模式单击并且如果用户选择确定我执行所需的操作。一切正常工作到最后为了刷新我的列表我需要调用方法我的另一个控制器。我尝试使用$ emit- $ on但无法使用它。请帮助如何从ModalInstanceCtrl控制器调用myIssuesController的GetAssignedIssues()方法。
angularjs代码
//controller1
var myIssuesController = function($scope, $sce, $http, cfpLoadingBar, deviceDetector, $filter, $modal, $log) {
$("#navMyIssues").addClass("active");
$scope.issueCommnets = null;
$scope.showComments = false;
$scope.Issues = [];
$scope.dateFormat = 'dd-MMM-yyyy';
$scope.dateTimeFormat = 'dd-MMM-yyyy h:mm:ss a';
$scope.selectedIssue = null;
$scope.statusName = null;
$scope.ProjectDetails = [];
$scope.selectedProject = null;
$scope.isVisible = false;
$scope.isVisibleReply = false;
$scope.notifiedMembers = null;
$scope.defaultProfileImagePath = "";
//get all assigned issues
$scope.GetAssignedIssues = function() {
alert('test');
//$scope.issueCount = -1;
$scope.issuesLoaded = false;
$scope.issueDetailsLoaded = false;
$scope.query = "";
var url = window.location.protocol + '//' + window.location.host + '/api/Issues' + '/GetAllAssignedIssues/';
$http.post(url, []).success(function(data, status, headers, config) {
if (data != '' || data.length == 0) {
$scope.Issues = data;
$scope.Issues = $filter('orderBy')($scope.Issues, 'CreatedOn', true);
for (var count = 0; count < $scope.Issues.length; count++) {
if ($scope.Issues[count].StatusName == "Pending") {
$scope.pendingIssueCount = $scope.pendingIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "In Progress") {
$scope.inprogressIssueCount = $scope.inprogressIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "Limitation") {
$scope.limitationIssueCount = $scope.limitationIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "Needs Research") {
$scope.needsresearchIssueCount = $scope.needsresearchIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "In Testing") {
$scope.intestingIssueCount = $scope.intestingIssueCount + 1;
}
}
if (data.length != 0) {
if ($scope.selectedIssue == null) {
$scope.selectedIssue = $scope.Issues[0];
} else {
for (var count = 0; count < $scope.Issues.length; count++) {
if ($scope.Issues[count].Id == $scope.selectedIssue.Id) {
$scope.selectedIssue = $scope.Issues[count];
}
}
}
}
$scope.issuesLoaded = true;
$scope.showIssueDetails($scope.selectedIssue);
} else {
$scope.errors.push(data.error);
//$scope.issueCount = -1;
}
if ($scope.isVisible == false) {
$("#changedetailsbox").hide();
$scope.isVisible = true;
}
if ($scope.isVisibleReply == false) {
$("#postReplybox").hide();
$scope.isVisibleReply = true;
}
}
);
};
$scope.$on("eventAssignedIssues", function (event,args) {
alert('test1');
$scope.GetAssignedIssues();
});
};
//controller 2
var ModalInstanceCtrl = function ($scope, $modalInstance,modalHeader,modalBody,issueId,issueEmailId,$http) {
$scope.modalHeader=modalHeader;
$scope.modalBody=modalBody;
$scope.issueId=issueId;
$scope.issueEmailId=issueEmailId;
$scope.ok = function () {
if($scope.modalHeader=="Delete Issue")
{
}
else if($scope.modalHeader=="Subscribe")
{
var issueNotification = { issueId: $scope.issueId, email: $scope.issueEmailId };
var url = window.location.protocol + '//' + window.location.host + '/api/Issues' + '/SubscribeIssueNotification/';
$http.post(url, JSON.stringify(issueNotification)).success(function (data, status, headers, config) {
if (data == "true" || data == true) {
//$scope.GetAssignedIssues();
$scope.$root.broadcast("eventAssignedIssues",{});
} else {
$scope.errors.push(data.error);
}
$scope.showeditdesc = true;
});
}
else if($scope.modalHeader=="Unsubscribe")
{
//for unsubscribing
var issueId = $scope.issueId;
var url = window.location.protocol + '//' + window.location.host + '/api/Issues' + '/UnsubscribeIssueNotification/';
$http.post(url, JSON.stringify({ issueId: issueId })).success(function (data, status, headers, config) {
if (data == "true" || data == true) {
//$scope.GetAssignedIssues();
$scope.$root.broadcast("eventAssignedIssues",{});
} else {
$scope.errors.push(data.error);
}
$scope.showeditdesc = true;
});
}
$modalInstance.close();
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};
答案 0 :(得分:3)
如果要在两个sibbling控制器之间进行通信,请使用$ rootScope.broacast() 请参阅此链接精彩说明 http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
答案 1 :(得分:1)
使用$ emit和$ broadcast将为您完成工作,如下所示
function firstCtrl($scope,$rootScope) {
$scope.broadcast = function(bcMsg){
$scope.broadcastMsg = bcMsg;
$rootScope.$broadcast('broadC',$scope.broadcastMsg);
}
$rootScope.$on('emitC',function(events,data){
$scope.emitMsg = data;
});
}
//second controller
myApp.controller('secondCtrl',secondCtrl);
//inject dependencies
secondCtrl.$inject = ["$scope","$rootScope"];
function secondCtrl($scope,$rootScope) {
$scope.$on('broadC',function(events,data){
$scope.broadcastMsg=data;
});
$rootScope.$on('emitC',function(events,data){
$scope.emitMsg = data;
});
}
使用指令在Using "require" in Directive to require a parent Controller
答案 2 :(得分:0)
了解事件阅读本文 - enter link description here 我已经找到了@Shubham Nigam帮助的解决方案,所以非常感谢他 - 首先我们需要在两个控制器中定义$ rootScope并使用$ on和$ broadcast使用$ rootScope.Here是我的更新代码
回答
//controller1
var myIssuesController = function($rootScope,$scope, $sce, $http, cfpLoadingBar, deviceDetector, $filter, $modal, $log) {
$("#navMyIssues").addClass("active");
$scope.issueCommnets = null;
$scope.showComments = false;
$scope.Issues = [];
$scope.dateFormat = 'dd-MMM-yyyy';
$scope.dateTimeFormat = 'dd-MMM-yyyy h:mm:ss a';
$scope.selectedIssue = null;
$scope.statusName = null;
$scope.ProjectDetails = [];
$scope.selectedProject = null;
$scope.isVisible = false;
$scope.isVisibleReply = false;
$scope.notifiedMembers = null;
$scope.defaultProfileImagePath = "";
//get all assigned issues
$scope.GetAssignedIssues = function() {
alert('test');
//$scope.issueCount = -1;
$scope.issuesLoaded = false;
$scope.issueDetailsLoaded = false;
$scope.query = "";
var url = window.location.protocol + '//' + window.location.host + '/api/Issues' + '/GetAllAssignedIssues/';
$http.post(url, []).success(function(data, status, headers, config) {
if (data != '' || data.length == 0) {
$scope.Issues = data;
$scope.Issues = $filter('orderBy')($scope.Issues, 'CreatedOn', true);
for (var count = 0; count < $scope.Issues.length; count++) {
if ($scope.Issues[count].StatusName == "Pending") {
$scope.pendingIssueCount = $scope.pendingIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "In Progress") {
$scope.inprogressIssueCount = $scope.inprogressIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "Limitation") {
$scope.limitationIssueCount = $scope.limitationIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "Needs Research") {
$scope.needsresearchIssueCount = $scope.needsresearchIssueCount + 1;
} else if ($scope.Issues[count].StatusName == "In Testing") {
$scope.intestingIssueCount = $scope.intestingIssueCount + 1;
}
}
if (data.length != 0) {
if ($scope.selectedIssue == null) {
$scope.selectedIssue = $scope.Issues[0];
} else {
for (var count = 0; count < $scope.Issues.length; count++) {
if ($scope.Issues[count].Id == $scope.selectedIssue.Id) {
$scope.selectedIssue = $scope.Issues[count];
}
}
}
}
$scope.issuesLoaded = true;
$scope.showIssueDetails($scope.selectedIssue);
} else {
$scope.errors.push(data.error);
//$scope.issueCount = -1;
}
if ($scope.isVisible == false) {
$("#changedetailsbox").hide();
$scope.isVisible = true;
}
if ($scope.isVisibleReply == false) {
$("#postReplybox").hide();
$scope.isVisibleReply = true;
}
}
);
};
$rootScope.$on('eventAssignedIssues', function (event, args) {
$scope.GetAssignedIssues();
});
};
//controller 2
var ModalInstanceCtrl = function ($rootScope,$scope, $modalInstance,modalHeader,modalBody,issueId,issueEmailId,$http) {
$scope.modalHeader=modalHeader;
$scope.modalBody=modalBody;
$scope.issueId=issueId;
$scope.issueEmailId=issueEmailId;
$scope.ok = function () {
if($scope.modalHeader=="Delete Issue")
{
}
else if($scope.modalHeader=="Subscribe")
{
var issueNotification = { issueId: $scope.issueId, email: $scope.issueEmailId };
var url = window.location.protocol + '//' + window.location.host + '/api/Issues' + '/SubscribeIssueNotification/';
$http.post(url, JSON.stringify(issueNotification)).success(function (data, status, headers, config) {
if (data == "true" || data == true) {
//$scope.GetAssignedIssues();
$rootScope.$broadcast('eventAssignedIssues');
} else {
$scope.errors.push(data.error);
}
$scope.showeditdesc = true;
});
}
else if($scope.modalHeader=="Unsubscribe")
{
//for unsubscribing
var issueId = $scope.issueId;
var url = window.location.protocol + '//' + window.location.host + '/api/Issues' + '/UnsubscribeIssueNotification/';
$http.post(url, JSON.stringify({ issueId: issueId })).success(function (data, status, headers, config) {
if (data == "true" || data == true) {
//$scope.GetAssignedIssues();
$rootScope.$broadcast('eventAssignedIssues');
} else {
$scope.errors.push(data.error);
}
$scope.showeditdesc = true;
});
}
$modalInstance.close();
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};