我试图在AngularJS引导方法中调用Web服务,这样当我的控制器最终执行时,它具有显示正确页面的必要信息。下面代码的问题当然是我的$ http.post(..)中没有定义$ rootScope。然后(...
我的回复是我想要的数据,如果$ rootScope设置在那一点,MultiHome控制器将会工作。如何在我的角度文档就绪方法中访问$ rootScope,或者有更好的方法吗?
angular.module('baseApp')
.controller('MultihomeController', MultihomeController);
function MultihomeController($state, $rootScope) {
if ($rootScope.codeCampType === 'svcc') {
$state.transitionTo('svcc.home');
} else if ($rootScope.codeCampType === 'conf') {
$state.transitionTo('conf.home');
} else if ($rootScope.codeCampType === 'angu') {
$state.transitionTo('angu.home');
}
}
MultihomeController.$inject = ['$state', '$rootScope'];
angular.element(document).ready(function () {
var initInjector = angular.injector(["ng"]);
var $http = initInjector.get("$http");
$http.post('/rpc/Account/IsLoggedIn').then(function (response) {
$rootScope.codeCampType = response.data
angular.bootstrap(document, ['baseApp']);
}, function (errorResponse) {
// Handle error case
});
});
答案 0 :(得分:1)
$ scope(以及$ rootScope)可以作为控制器和视图之间的粘合剂。我不会用它来存储应用程序类型信息,例如用户,身份或安全性。为此,我使用constant方法或factory(如果您需要封装更多逻辑)。
使用常量的示例:
var app = angular.module('myApp',[]);
app.controller('MainCtrl', ['$scope','user',
function ($scope, user) {
$scope.user = user;
}]);
angular.element(document).ready(function () {
var user = {};
user.codeCampType = "svcc";
app.constant('user', user);
angular.bootstrap(document, ['myApp']);
});
注意由于我们正在引导应用,您需要在视图中删除ng-app指令。
这是一个有效的fiddle
答案 1 :(得分:0)
您可以在run()
块中将其设置为在引导期间执行:
baseApp.run(function($rootScope) {
$rootScope.codeCampType = response.data;
});
angular.bootstrap(document, ['baseApp']);
我认为你不能使用注射器,因为在引导之前没有创建范围。 config()
块也可以正常工作,可以让您在需要的地方注入数据。