我需要在第一个控制器的方法中从第二个cotroller调用初始化用户设置值(设置为rootscope)的方法。
将值成功设置为rootscope返回前提后,继续执行第一个控制器的第二个方法。
我尝试使用发射和广播示例,但没有运气。
有人可以给我一个如何正确操作的建议吗?
我在Angular 1.2和Ionic 1,beta 13
非常感谢您的帮助。
模板:
<ion-view title="{{ 'DAYS_RESULTS' | translate }}" >
<ion-content ng-controller="DailyStatsCtrl" ng-init="setData()">
代码:
// First cotroller call setData in ng-init
angular.module('starter')
// Controller definition
.controller('DailyStatsCtrl', function($scope, $rootScope, $ionicSlideBoxDelegate, $timeout , $ionicLoading , $q, $translate, DialsComputeService, cordova, LocalStorService, $ionicPopup, $state, $ionicNavBarDelegate, testService, $ionicPlatform) {
$scope.setData = function() {
$ionicPlatform.ready(function() {
$timeout(function() {
$scope.$emit("onSomething", "");
alert("TEST");
}, 1000);
});
};
在第二个控制器中:
angular.module('starter')
// Controller definition
.controller('SettingsCtrl', function($scope, $rootScope, $ionicLoading, $ionicPlatform, LocalStorService, $timeout, $translate, $ionicPopup, $state, $ionicNavBarDelegate) {
$scope.getUserSettigns = function() {
alert("received");
$scope.test = 'event received';
}
$scope.$on('onSomething', function(e) {
$scope.getUserSettigns();
});
答案 0 :(得分:1)
在离子模式下,在控制器视图加载之前无法调用控制器功能。如果已加载第二个控制器的视图,则可以执行以下操作:
<强> secondview.html:强>
设置ion-content id以获取控制器范围
<ion-view title="second">
<ion-content id="secondView">
</ion-content>
</ion-view>
第二控制器:
app.controller('SecondController', function($scope, $http) {
$scope.someFunction = function(args) {
alert(args.Message);
};
});
<强>代码:强>
app.controller('CodeController', function($scope) {
$scope.$on('$ionicView.beforeEnter', function(){
angular.element($('#secondView')).scope().someFunction({ Message: "Hello!" });
});
});
希望这有帮助。
答案 1 :(得分:0)
要实现此目的,您实际上不需要使用$rootScope
(但您可以),$broadcast
将在当前和所有子范围内调用观察者事件,因此父控制器中的此代码:< / p>
$scope.setData = function() {
$timeout(function() {
$scope.$broadcast("onSomething", "");
}, 5000);
};
将触发当前和所有子控制器中的所有$scope.$on('onSomething', ..)
回调。
这是一个带有工作示例的代码(文本'收到的事件'将在渲染的html中出现5s之后)。
答案 2 :(得分:0)
我确实刚刚做了一些事件发射。这是一种痛苦,但现在已经很低了:
$scope.$broadcast
这将在子范围内发出事件
Angular Doc定义:
将事件名称向下调度到所有子范围(及其子级)
$scope.$emit
这将发出直到父作用域
的事件Angular Doc定义:
通过范围层次结构向上调度事件名称
我和我的同事相信这是最好的方法。但我也相信这是最可靠的:
在调度事件的控制器/服务中注入$rootScope
并使用$broadcast
.service('DispatchEvent', ['$rootScope', function ($rootScope) {
$rootScope.$broadcast('someEvent');
}]);
在接收事件的控制器/服务上,注入$scope
并使用$on
.controller('ReceivingEventsController', ['$scope', function ($scope) {
$scope.$on('someEvent', function (e) {
// do something
});
}]);
这样$rootScope
将永远是$broadcast
范围层次结构,因为 - 顾名思义 - 它是根范围。因此,现在您不必担心是使用$emit
还是$broadcast
,因为使用$scope
表示它始终是$rootScope
的孩子。
所以在你的情况下,这很容易。第一个控制器应注入$rootScope
并使用$broadcast
。第二个控制器应该$scope
并使用$on
,如下所示:
$scope.$on('onSomething', function(e) {
$scope.getUserSettings();
});
这是一个工作的掠夺者:http://plnkr.co/edit/PrD3vB80lFSt0a9WQLJ9?p=preview