2017-11-01 1 views
0

起動時に空の配列が含まれるこの角度サービスがあります。ゲッターで、私はそれが戻っているものを記録する。私は、ロギングステートメントの周りにロジックを書く必要がないようにしたいと思います。ロギングステートメントを今のところ残したいと思います。ここ空の配列の長さを呼び出す際に例外を修正するにはどうすればいいですか

がプロバイダの:

appInstance.service('ActivityNavigationDataService', 
    ['$log', '$rootScope', 'UIManager', 
    function($log, $rootScope, UIManager) { 
     $log.debug('ActivityNavigationDataService constructor'); 

     $rootScope.activities = []; 

     UIManager.registerActivityListener($rootScope, activitiesUpdated); 

     function activitiesUpdated(event, activities) { 
      $rootScope.activities = activities; 
     } 

     this.getActivities = function() { 
      $log.debug('returning ' + $rootScope.activities.length + ' activities'); 
      return $rootScope.activities; 
     }; 
}]); 

ここでエラーです:

TypeError: Cannot read property 'length' of undefined at Object.getActivities (ActivityNavigationDataService.js:28) at new ActivityNavigationServiceController (ActivityNavigationServiceController.js:31) at Object.instantiate (angular.js:5055) at $controller (angular.js:11015) at UIManager.js:40 at processQueue (angular.js:17051) at angular.js:17095 at Scope.$digest (angular.js:18233) at angular.js:18462 at completeOutstandingRequest (angular.js:6362) "Possibly unhandled rejection: {}"

考えですか? のthnx、マット・

編集: 私はこの問題はActivityNavigationDataServiceがactivitiesUpdatedが呼び出された時点でロードされ、構築完了していないと思います。

私はこのように[]定義を介してサービスをロードしています:UIManager.buildUI()メソッドは、ブロードキャストメッセージを介してActivityNavigationServiceに今度はプッシュ活動、追加のリソースをロードするためにocLazyLoadを使用

define(['services/ActivityNavigationDataService', 
     // theres others here 
     'controllers/UIManager'], 
    function() { 
     'use strict'; 
     var appInstance = angular.module('obdPortletApp'); 
     appInstance.controller('obdMasterController', ['$rootScope','$scope', '$log', 'UIManager', 
       function($rootScope, $scope, $log, UIManager) { 

       UIManager.initialize(); 
       UIManager.buildUI(); 
     }]); 
    } 
); 

サービスへの直接参照ではありません。

だから私は何かタイミングがずれていると思う。

+3

あなたはこの例外を持っている場合、配列は空ではありません。そうでない場合は、あなたはこのような何かを行うことができます。 '$ rootScope' **は**未定義です。これは 'undefined.length'を実行しているかのようです。 '[] .length'は空でもうまく動作します – yuantonito

+0

まあ、' 'activitiesUpdated''イベントリスナーは' $ rootScope.activities'を '' undefined''に設定しました。 – fubar

+0

私は同様のエラー(同様のログメソッドから)activitiesUpdatedを取得していました。私は$ rootscopeが定義されていないと考えている。なぜどんなアイデア? – tatmanblue

答えて

0

activitiesUpdated()undefinedのハンドブックがactivitiesになっています。 activitiesを返す方は、空の配列を返すようにしてください。

function activitiesUpdated(event, activities) { 
    $rootScope.activities = activities || []; 
} 
関連する問題