2017-05-25 138 views
0

我正在处理角度应用,我有多个角度控制器。来自一个控制器的值应该可用于其他控制器

请看以下示例代码:

app.controller('ctrlOne',function($rootScope, $scope, $uibModal, MyService) { 

//have some functionality here 
$scope.loadCtrlOneData = function() { 
     alert("loadCtrlOneData"); 
     MyService.getSIDResult().then(
      function (response) { 
     //business logic 
     }) 
}} 

app.controller('ctrlTwo', function ($rootScope, $scope, $uibModal, MyService) { 
//some functionality here 
function loadData() { //jQuery load to load the calendar in the field 
MyService.getValueForDatePicker().then(
      function (response) { 
       var cb = function(start, end, label) { 
      //This function is called when user submit the date in datepicker 
$('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); 
        } 
}) 
} 
loadData(); 
}) 

上面的代码是我的代码的画面粗糙。加载页面时,加载ctrlOne和ctrlTwo。 CtrlTwo用于在输入字段以显示日期选择器如示于下面的代码:

<input id="reportrange" ng-controller="ctrlTwo"> 

当用户拿起从日期选取器的日期和点击提交,再次ctrlOne应该叫和日期值应在可用ctrlOne,在那里我有一些逻辑来实现,并再次显示在浏览器上的结果。请找到datepicker的演示here。请建议如何调用ctrlOne当用户选择日期并点击提交和日期值应该可用于ctrlOne 。

+2

使用服务提供商联合观测。在角2中,您将提供者依赖注入到控制器中,并可以订阅提供者上的属性。然后一个控制器可以通过'next'推送一个值,而另一个控制器可以订阅属性。 – kyle

+0

我使用的是angularjs(angular1)@kyle – participantjava

+0

https://docs.angularjs.org/guide/providers – kyle

回答

1

我知道这不是处理您的问题最优雅的方式,但如果我明白你想达到什么,我建议使用角度事件系统。有关更多详细信息,请参见this博客文章。特别是使用$ rootScope。($ emit/$ broadcast)的部分。

更清晰,你可以使用:在ctrlTwo $rootScope.$broadcast('someEventName', someValue)然后

$scope.$on('someEventName', function (event, data) { //data passed in ctrlTwo }) 

在ctrlOne

+0

但在我的情况下,所有控制器都是单独的,没有父母/子女的关系。我还可以在controllerOne中使用$ broadcast来获取controllerTwo的值。 – participantjava

+0

这就是为什么我建议使用$ rootScope的一部分。 $ rootScope是所有控制器的父级。 – tomeks

+0

$ rootScope无法识别jQuery函数var cb = function(start,end,label){..}。请参阅日期控制演示http://plnkr.co/edit/qKsrQVmbxqq5Iqw3NEvI?p=preview(ctrlTwo) – participantjava

相关问题