3

我很困惑,我有这个模块可以路由到不同的控制器:

var mainModule = angular.module('lpConnect', []).
    config(['$routeProvider', function ($routeProvider) {
    $routeProvider.
        when('/home', {template:'views/home.html', controller:HomeCtrl}).
        when('/admin', {template:'views/admin.html', controller:AdminCtrl}).
        when('/connect', {template:'views/fb_connect.html', controller:MainAppCtrl}).
        otherwise({redirectTo:'/connect'});
}]);

和这样的公共服务:

mainModule.factory('Common', ['$rootScope', '$http', function (scope, http) {
        var methods = {
            changeLanguage:function (langID) {
                http.get('JSON/langs/' + langID + '/captions.json').success(function (data) {
                    scope.lang = data;
                });
            },
            initChat:function () {
                console.log(scope); // full object
                console.log(scope.settings); // undefined
            }
        };

        //initiate
        http.get('JSON/settings/settings.json').success(function (data) {
            scope.settings = data;
            methods.changeLanguage(scope.settings.lang);
        });


        return methods;
    }]);

该应用程序加载并(通过 XHR)获取设置对象,我可以看到设置反映在我的 DOM 中。(例如字幕)

现在,当我从 HomeCtrl 调用 initChat 方法时,我在尝试访问 scope.settings 属性时得到一个未定义的值……奇怪的是,当我记录范围时,我可以看到设置对象……我错过了什么?

在此处输入图像描述

更新:我发现我做错的是直接从控制器主体调用我的方法:

function HomeCtrl($scope, $location, Common) {
...
Common.initChat()
...
}

如果我将调用更改为由单击触发,一切正常,但我确实需要在页面加载时运行此代码,正确的方法是什么?

4

2 回答 2

3

我认为这是一个简单的问题:在 $http 调用检索 scope.settings 之前,您正在范围内调用 initChat。

于 2012-07-08T15:18:05.500 回答
0

几件事。

  1. http 是异步的,这是您的主要问题(正如安迪敏锐地指出的那样)
  2. 不推荐 ng-init 用于生产代码,在控制器中初始化更好
  3. 初始化您的 scope.settings = {} 或一个不错的默认值可能会对您有所帮助,一旦 xhr 完成,您的设置将可用。

希望这可以帮助

- 担

于 2012-07-11T17:59:25.747 回答