Javascript 如何使用多个广播根据用户选择调用角度控制器
我正在开发angularjs应用程序。在我的网页中,我有许多数据范围选择器。当用户从日期选择器中选择日期范围时,我需要将所选日期传递给分配给该组件的特定角度控制器。请参阅下面的代码,当用户从日期选择器中选择日期范围时调用该代码,当单击应用时,我使用$broadcast将所选日期传递给另一个控制器Javascript 如何使用多个广播根据用户选择调用角度控制器,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我正在开发angularjs应用程序。在我的网页中,我有许多数据范围选择器。当用户从日期选择器中选择日期范围时,我需要将所选日期传递给分配给该组件的特定角度控制器。请参阅下面的代码,当用户从日期选择器中选择日期范围时调用该代码,当单击应用时,我使用$broadcast将所选日期传递给另一个控制器 var cb = function(start, end) { $('.reportrange span').html(start.format('MMMM D, YYYY') + ' - ' +
var cb = function(start, end) {
$('.reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));
var reportStartDate = start.format('MM-DD-YYYY');
var reportEndDate = end.format('MM-DD-YYYY');
$rootScope.$broadcast('loadSimDateCtrl', reportStartDate, reportEndDate);/*When user selects a date range in daterangepicker, this function is invoked,
the selected date is passed to the angular controller using broadcast*/
}
当我的单个html文件中有多个日期范围选择器时,如何知道选择了哪个日期范围选择器。根据为特定日期选择器选择的日期,我需要将日期范围传递给特定的角度控制器。请给我一些建议
给出了一个粗略的例子。
当用户从SIM Date Range ctrl中选择一个darerange时,我需要通过传递所选日期来调用SIMDATECRL。其他日期选择器也是如此。请给我一些建议。
在单个函数中,var cb=function(start,end){.}
如何调用$broadcast,后者反过来调用另一个角度控制器。
angular.module('myApp',[])
.controller('MyCtrl'、['$scope'、'$http'、'$rootScope',MyCtrl])
函数MyCtrl($scope、$http、$rootScope){
$scope.callBackend1=函数(事件){
console.log('Check1')
$rootScope.$broadcast('date1','start1','end1')
//此处调用后端,如果可能,使用$http服务
}
$scope.callBackend2=函数(事件){
console.log('Check2')
$rootScope.$broadcast('date2','start2','end2')
//此处调用后端,如果可能,使用$http服务
}
$rootScope.$on('date1',函数(事件、数据){
console.log(数据)
})
$rootScope.$on('date2',函数(事件、数据){
console.log(数据)
})
}
选择电话日期范围:
不要使用广播,因为它会向下传播到嵌套的控制器,不能保证所有子级都会收到该通知。而是编写一个在发布时发出事件的服务,您可以在任何控制器中订阅该事件。在MyCtrl中,您可以为每个daterange选择器指定不同的作用域函数更改/选择所指出的事件
;(function(angular) {
"use strict";
angular.module('myApp').factory('PubSub', PubSub);
PubSub.$inject = ['$rootScope'];
function PubSub($rootScope) {
var service = {};
service.subscribe = function(eventname, callback) {
$rootScope.$on(eventname, callback);
}
service.publish = function(eventname) {
var args = Array.prototype.slice.call(arguments, 1);
var argv = {
argv: args
};
$rootScope.$emit(eventname, argv);
}
service.unsubscribe = function(handler) {
handler();
}
return service;
}
angular.module('myApp').controller('MyCtrl', MyCtrl);
MyCtrl.$inject = ['$scope', 'PubSub'];
function MyCtrl($scope, PubSub) {
$scope.callBackend1 = function(event) {
console.log('Check1')
PubSub.publish('date1', 'start1', 'end1')
// here call to backend, if possible do with $http service
}
$scope.callBackend2 = function(event) {
console.log('Check2')
PubSub.publish('date2', 'start2', 'end2')
// here call to backend, if possible do with $http service
}
}
angular.module('myApp').controller('Date1Ctrl', Date1Ctrl);
Date1Ctrl.$inject = ['$scope', 'PubSub'];
function Date1Ctrl($scope, PubSub) {
PubSub.subscribe('date1', date1Changed);
function date1Changed(args) {
// Do your actions here
}
}
angular.module('myApp').controller('Date2Ctrl', Date2Ctrl);
Date2Ctrl.$inject = ['$scope', 'PubSub'];
function Date2Ctrl($scope, PubSub) {
PubSub.subscribe('date2', date2Changed);
function date2Changed(args) {
// Do your actions here
}
}
})(angular);
它可以播放不同的事件。例如$rootScope.$broadcast('loadSimDate1',reportStartDate,reportEndDate)$rootScope.$broadcast('loadSimDate2',reportStartDate,reportEndDate)但当用户从第一个日期范围选择器中选择日期时,我应该知道日期是从第一个日期范围选择器中选择的,这样我就可以调用相应的控制器。同样,当用户从第二个日期范围选择器中选择日期时,我应该调用know,这样我就可以调用相应的角度控制器。请参见@J jin该过程是:当用户从第一个日期范围选择器选择日期时,它使用“ng change=“callBackend1($event)”,在callBackend1中调用广播“loadSimDate1”,然后在相应的控制器中发出“loadSimDate1”。因此,对于2st daterange选择器。@JJin-您能在我的演示@participantjava中给出一个简单的示例吗?对于相同的功能,您不需要两个控制器。我们可以定制一个可以接受任何日期选择器值的控制器,因为整个应用程序中日期选择器的功能是相同的,对吗