2017-05-25 78 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

相關問題