2015-06-25 45 views
0

我們正在嘗試使用phonegap onsen和angularJS開發應用程序。來自不同控制器的angularJs調用函數

我想從不同的控制器調用一個函數。我已經看到很多關於如何做到這一點的文檔,如this

但是由於某些原因,它不適用於我。這是我的代碼到目前爲止。

module.run(function ($rootScope) { 
    $rootScope.$on('some-event-here', function (event, data) { 
     console.log('1'); 
     $rootScope.$emit('show-dialog-of-some-event', data); 

     //I also tried 
     //$rootScope.$broadcast('show-dialog-of-some-event', data); 
    }); 
}); 

module.controller('controller1', ['$scope', '$http', function($scope, $http) { 
    $scope.proceed = function() { 
     console.log('0'); 
     $scope.$emit('some-event-here', {}); 
    } 
}]); 

module.controller('controller2', ['$scope', '$http', function($scope, $http) { 
    $scope.$on('show-dialog-of-some-event', function (event, data) { 
     console.log('2'); 
     ons.createDialog('some-dialog.html').then(function(dialog) {       
      //some code here 
     }); 
    }); 
}]); 

它顯示在控制檯'0'和'1'上,但它不顯示'2'。

這可能是一個簡單的問題,但我似乎無法找到我的代碼的問題。

在此先感謝。

+0

嘗試使用'$ rootScope。$ broadcast'而不是'$ emit'在你的運行函數中 –

+0

@NexusDuck我已經試過了。 $ rootScope。$ broadcast('show-dialog-of-some-event',data); - 仍然不起作用 – Eddie

+0

奇怪,我會做一個plnkr並測試它。順便說一句,我沒有看到你在這個問題中引用的其他模塊,這是所有相關的代碼? –

回答

0

如果你是兄弟控制器之間,並從父控制器通信到子控制器,你必須使用$範圍。$廣播,但如果你想溝通,從孩子到家長,你必須使用$範圍。$發出

+0

如果您嘗試在父母和孩子之間進行通信,該怎麼辦? – Eddie

+0

但廣播在我的結尾不起作用。我試過了,它似乎不起作用在我身上 – Eddie

+0

我正在爲你的問題做小提琴: 直到那時你可以檢查這個鏈接:http://toddmotto.com/all-about-angulars-emit-broadcast-on-發佈 - 訂閱/很好的解釋 –

1

我認爲可能發生的是,你在controller2的本地範圍(即$ scope)中爲事件'show-dialog-of-some-event'聲明事件處理程序。您在$ rootScope中發出一個事件。發射的事件不會失效,所以事件'show-dialog-of-some-event'不會從$ rootScope「下降」到$ scope。您可能想要在根範圍上定義「show-dialog-of-some-event」的事件處理程序,例如

$rootScope.$on('show-dialog-of-some-event', function(e,d) {}); 
0

2東西是你的代碼錯誤:

1:$broadcast氣泡事件下降的範圍層次,$emit是沸騰起來的範圍層次,而不是使用:

$rootScope.$broadcast('show-dialog-of-some-event', data); 

欲瞭解更多信息,請參閱此答案:$rootScope.$broadcast vs. $scope.$emit

2:您的模塊的run功能將ex ecuted之前,控制器會附加一個事件處理此事件,因此該事件將已經由您在控制器配置的事件處理程序的時間過去了:

再次看到這個答案AngularJS app.run() documentation?

所以解決你的答案是:

  • 變化$emit$broadcast
  • $broadcast呼叫後進入生命週期,因此controller會附上它的聽衆

這裏就是我打電話$broadcast在生命週期後(在這種情況下,當窗口負載)一plunkr:

http://plnkr.co/edit/W7efiKqIlu4va4AcBTbG

+0

我在所有的代碼下調用了module.run(函數($ rootScope),但仍然不起作用。 – Eddie

+0

@EddieWho在您的文件中,稍後的生命週期中,運行將在您的控制器代碼將被處理,無論你把它放在哪裏 –

+0

原諒我的無知..你怎麼能做到這一點? – Eddie

0

如果沒有需要處理的rootscope你什麼可以將$ rootScope注入控制器中

module.controller('controller1', ['$scope', '$http', '$rootScope', function($scope, $http, $rootScope) { 
    $scope.proceed = function() { 
     console.log('0'); 
     $rootScope.$boardcast('some-event-here', {}); 
    } 
}]); 

module.controller('controller2', ['$scope', '$http', function($scope, $http) { 
    $scope.$on('some-event-here', function (event, data) { 
     console.log('2'); 
    }); 
}]); 

它比使用服務更不乾淨,但如果不太經常使用此模式。

相關問題