【问题标题】:setting $rootScope but value then not visible from another controller设置 $rootScope 但值然后从另一个控制器不可见
【发布时间】:2014-06-25 14:06:11
【问题描述】:

我的申请要求候选人具有代理机构和国籍(除其他外)。我想在全局变量中设置机构和国籍列表,以便他们可以通过配置文件屏幕访问,而不是每次都从数据库中检索(就像目前一样)。多亏了这里的其他问题,我到目前为止……但显然缺少一个关键的拼图。正在从数据库中检索数据,但随后在其他地方看不到。

加载数据的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);
}

警报根本不会触发。

来自候选人controller.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 值是“未定义”。

我有两个理论 -

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

  2. 我被 javascript 的异步特性所吸引,当我加载第二页时,数据还没有出现。我不相信这是正确的,因为数据库调用正在完成,并且我收到了一个警报,显示了一个随机的国籍名称并且它就在那里。

我感到沮丧的部分原因是 GetNationalityList 和 GetAllAgencies 代码 sn-ps 工作并在候选控制器中正确分配值(现在已注释掉的位),但在主控制器中的工作方式略有不同。

请给我一些重要的提示?

【问题讨论】:

    标签: angularjs angularjs-scope


    【解决方案1】:

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

    Angular $rootScope.$on Undefined

    【讨论】:

      【解决方案2】:

      您的第二点更多是您的问题,尽管本质上不是异步的 JavaScript,而是诸如 GetAllAgencies 服务之类的 Angular 服务。您正在进行异步调用,但不等待响应。这就是为什么当您手动分配它时一切正常。尝试将您的 alert() inside 回调函数放在 getData() 调用中。这应该突出该过程的工作方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 2022-01-21
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多