设置$ rootScope,但从另一个控制器看不到值

时间:2014-06-25 14:06:12

标签: angularjs angularjs-scope

我的申请要求候选人设立代理机构和国籍(以及其他事项)。我想在全局变量中设置代理和国籍列表,以便可以通过配置文件屏幕访问它们,而不是每次都从数据库中检索它们(就像它们当前一样)。感谢这里的其他问题,到目前为止......但是一个关键的拼图显然已经缺失了。数据正在从数据库中检索,但在其他地方不可见。

homecontroller.js加载数据......

//Home page Controller
function HomeCtrl($scope, $rootScope, SessionTimeoutService, GetAllAgencies, GetNationalityList){

    GetAllAgencies.getData({}, function(agencieslist, $rootScope) {
        SessionTimeoutService.checkIfValidLogin(agencieslist);
        $rootScope.agencieslistglobal = agencieslist.data;
    });

/*  I tried hard-coding values here - that worked & was passed thro' ok  
    $rootScope.nationalitieslistglobal = [
        {'nationality_id' : 0, 'name' : 'Unknown'},
        {'nationality_id' : 1, 'name' : 'Known'},
        {'nationality_id' : 2, 'name' : 'Pants'},
    ]; */
    GetNationalityList.getData({}, function(nationalitieslist, $rootScope) {
        SessionTimeoutService.checkIfValidLogin(nationalitieslist);
        $rootScope.nationalitieslistglobal = nationalitieslist.data;
    });

    alert($rootScope.nationalitieslistglobal[8].name);
}

警报根本不会发射。

来自candidatecontroller.js:

function CandidatesAddCtrl($scope, CandidateModel, GetNationalityList,      SessionTimeoutService, $http, GetAllAgencies, $rootScope) {
/* commented out as this should now be done globally - this works when it's in place
    GetAllAgencies.getData({}, function(agencieslist) {
        SessionTimeoutService.checkIfValidLogin(agencieslist);
        $scope.agencieslist = agencieslist.data;
    });
*/
    CandidateModel.getBlankCandidate();
    $scope.candidateinfo = CandidateModel;

    // get global agencies list
    $scope.agencieslist = $rootScope.agencieslistglobal;
    alert($scope.agencieslist); // shows 'undefined'

    /*
        GetNationalityList.getData({}, function(nationalitieslist) {
            SessionTimeoutService.checkIfValidLogin(nationalitieslist);
            $scope.nationalitieslist = nationalitieslist.data;
        });
    */
    // get global nationalities list
    $scope.nationalitieslist = $rootScope.nationalitieslistglobal;
....
}

所以......当我对GetNationalityList.getData函数之外的数据进行硬编码时(在上面的例子中注释掉的那个位),它被填充了&通过OK&我的下拉列表填充。当我不这样做时,$ rootScope值是'undefined'。

我有两个理论 -

  1. 以某种方式,homecontroller $ rootScope没有被识别为我想要的全局(这只是变量的名称),还需要采取其他一些“回传”动作(我已尝试过几次) “return nationalitieslist.data”的变体,并将其分配给其他变量/句柄)。此外,nationalitieslist.data与硬编码列表的格式相同,只是更长。

  2. 我被javascript的异步性质所困扰,当我加载第二页时,数据还没有。我不相信这是正确的,因为数据库电话正在完成,我有一个警报,它显示了一个随机的国籍名称,它就在那里。

  3. 我的沮丧部分来自GetNationalityList和GetAllAgencies代码片段在候选控制器中正确分配值(现在已注释掉的位)这一事实,但在homecontroller中工作方式略有不同。

    最重要的提示,有人,请?

2 个答案:

答案 0 :(得分:2)

我相信这篇文章可以提供帮助。 http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/ 我有一些类似的问题,但我需要从工厂排放。 我的问题在这里得到了回答。

Angular $rootScope.$on Undefined

答案 1 :(得分:0)

你的第二点更多是你的问题,虽然它不是本质上异步的JavaScript,它是Angular服务,例如你的GetAllAgencies服务。您正在进行异步调用但不等待响应。这就是为什么当你手动分配它时一切正常。尝试将alert() 置于回调函数中getData()。这应该强调该过程应该如何运作。