6

通常の関数を介してグローバル変数にアクセスしようとしていますが、可能ですか?

$rootScope を使用して var を設定しましたが、コールバック関数を介してこれにアクセスしようとしています。このコールバックはコントローラーから呼び出されます。$rootScopeそのコールバックを渡したくありません。

それにアクセスする方法はあります$rootScope.varか?

可能であれば、私はサービスを利用します。

提案してください。

ありがとう

次のように rootScope にアクセスしようとしています。

    function fbLandingCtrl($scope, $rootScope) {
    $rootScope.isFBLoggedin = false;
    $scope.login = function() {
       console.log( $rootScope.isFBLoggedin);
       fbHelper.login(getUserInfo);
      };

      function getUserInfo(){
          fbHelper.getUserInfo(updateStatus);
      }
      function updateStatus(userInfo){
          $rootScope.isFBLoggedin = true;
          console.log( $rootScope.isFBLoggedin);
      }
  }

私のサービスは次のとおりです。

    myapp.factory('FBService', [ '$rootScope', function ($rootScope) {
    $rootScope.isFBLoggedin = false; // global variable
    $rootScope.userName = null;
    $rootScope.userEmail = null;

    return {

        getStatus: function() {
            return $rootScope.isFBLoggedin;
        },
        setStatus: function(status) {
            console.log("Status:"+status);
            return $rootScope.isFBLoggedin = status;
        }
       };
}]);

updateStatus fn の下に isFBLoggedin が true として表示されていますが、ビューには反映されていません

印刷{{isFBLoggedin}}していますが、ts は false を示していますか?

最後にその作業。

@dluzのソリューションに従いました。

$rootScope.$apply(function() {}})ビューをレンダリングするためにも使用しました

4

2 に答える 2

5

$rootScope を使用して関数を定義しないでください。これは本当に悪い習慣です。結局、$rootScope はグローバル変数であることを思い出してください。

次のようなサービスを介して $rootScope を取得できます。

<!doctype html>
 <html lang="en" ng-app="myApp">
  <head>
<meta charset="UTF-8">
<title>Document</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>

  <script>

     var myApp = angular.module('myApp', []);

      myApp.controller('myAppCtrl', ['$scope', 'myService', function ($scope, myService) {

       console.log(myService.getData());
    
}])

        myApp.factory('myService', [ '$rootScope', function ($rootScope) {
    
       return {
        
        getData: function() {
            return $rootScope;
        }
       };
      }])


    </script>

  </head>
  <body ng-controller="myAppCtrl">

   </body>
   </html>

$rootScope は存在しますが、悪用される可能性があります

Angular のスコープは階層を形成し、典型的にはツリーの最上部にあるルート スコープから継承します。ほとんどのビューには独自のコントローラー、つまりスコープがあるため、通常、これは無視できます。

場合によっては、アプリ全体に対してグローバルにしたいデータの断片があります。これらの場合、$rootScope を注入して、他のスコープと同様に値を設定できます。スコープはルート スコープから継承されるため、これらの値は、ローカルの $scope の値と同様に、ng-show などのディレクティブに関連付けられた式で使用できます。

もちろん、グローバルな状態は最悪であり、$rootScope は慎重に使用する必要があります。これは、(願わくば) どの言語でもグローバル変数を使用する場合と同様です。特に、コードには使用せず、データのみに使用してください。$rootScope に関数を配置したい場合は、ほとんどの場合、必要な場所に挿入でき、より簡単にテストできるサービスに配置することをお勧めします。

逆に、データのビットを保存して返すことだけを目的とするサービスを作成しないでください。

更新された回答

A_J さん、あなたのアプリケーションのシナリオがわかりません。より良い回答を得るには、さらにコードを確認する必要がありますが、以下のコードをご覧ください。$rootScopeたぶん、内にアクセスするコードをどのように設計できるかについてのアイデアが得られるかもしれませんservice

「ログイン」ボタンを押して、コンソールを見てください。ここでの実例 ( http://jsbin.com/olOyaHa/1/ )

 <!doctype html>
 <html lang="en" ng-app="myApp">
    <head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>

 <script>

     var myApp = angular.module('myApp', []);

     myApp.controller('fbLandingCtrl', ['$scope', '$rootScope', 'loginService', function ($scope, $rootScope, loginService) {

    $rootScope.isFBLoggedin = false;
    
    $scope.login = function() {
       console.log('Current login status', $rootScope.isFBLoggedin);

       console.log(loginService.getUserInfo());

       loginService.login(loginService.getUserInfo());

       loginService.updateStatus();
      };

    
     }]);


     myApp.factory('loginService', [ '$rootScope', function ($rootScope) {
    
    return {
        
        login: function() {
            console.log('now I am logged in!');
            return $rootScope.isFBLoggedin = true;
        },

        getUserInfo: function() {
            return {
                username: 'xmen',
                role: 'admin',
                logged: 'false'
            };
        },
        
        updateStatus: function(userInfo){
            $rootScope.isFBLoggedin = true;
            console.log('Current login status', $rootScope.isFBLoggedin);
        }
        };
     }])


    </script>

 </head>
 <body ng-controller="fbLandingCtrl">
    <button ng-click="login()">Log Me In</button>
 </body>
 </html>
于 2013-10-02T13:21:30.440 に答える
2

$rootScope をコントローラー参照として追加した場合、コントローラー内の $rootScope.var にアクセスできます。

function MyCtrl($scope, $rootScope, $routeParams /*, ... */)
{
  /* Controller code and callback code here */
}

コールバックがコントローラー内で定義されている限り機能します。

編集: 議論の後、rootScope 内で関数を定義する方法は次のとおりです。

yourApp.run($rootScope/*, ResourceProvider ... */) {
    $rootScope.yourFunction= function () {
        /* The code of you functions */
    }
}
于 2013-10-02T13:12:48.137 に答える