1

angularで1つのコントローラーからphpファイルにリクエストを送信しようとしており、応答を取得しています。controller.run() メソッドで 0 で初期化される rootScope 変数に応答を格納しました。

PHPページからの応答を表示するために、更新されたrootScopeを別のコントローラーで使用しようとしています。しかし、rootScope は更新されておらず、まだ 0 が表示されています。

これが私のコードです。

以下は、rootScope が初期化される run メソッドです。

adminController.run(function ($rootScope) {
    $rootScope.n = 0;
});

以下は、PHP ページからの応答を要求し、rootScope 変数を更新しているコントローラー 1 のコードです。

adminController.controller('adminLoginController', function($scope,$rootScope,$http,$window) {

    $scope.loginCheck = function(event,user){
        var request = $http({
            method: "post",
            url: "../_/php/loginCheck.php",
            headers: { 'Content-Type': 'application/x-www-form-urlencoded'     }
        });
        request.success(function (data) {
            $rootScope.n=data;
            $rootScope.$apply();
            $window.location.href = 'admin.html#admin_home';       
        });
    }
});

これは、rootScope 変数を利用している 2 番目のコントローラーのコードです。ここで問題が発生するのは、rootScope が更新されず、初期化された 0 のみが表示されるためです。

adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {
    $scope.uname=$rootScope.n;
    alert($scope.uname);
});

どこが間違っているのか教えてもらえますか。

4

3 に答える 3

3

あなたの問題はタイミングの問題のように聞こえます。とコントローラ間で通信する$rootScopeために、変更をリッスンするイベントを設定できます。

ルート スコープを更新します。

$rootScope.$broadcast('n', data);

変更をリッスンします。

$rootScope.$on('n', function (event, data) {
    //do something with new value 'data'
});
于 2016-01-27T16:08:52.960 に答える
1

HTML

<body ng-app="adminController">

<div ng-controller="adminLoginController">
        <button ng-click="loginCheck()">loginCheck</button>
    </div>

    <div ng-controller="adminHomeController">
    <button ng-click="getval()">getVal</button>
        rootscope val {{uname}}
    </div>
</body>

コントローラー

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

app.run(function ($rootScope) {
    alert("run");
    $rootScope.n = 0;
});

adminController.controller('adminLoginController', function($scope,$rootScope,$http,$window) {

    $scope.loginCheck = function(){
        alert("Inside loginCheck");
        $rootScope.n = 1;      
    }
});

adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {

    $scope.getval = function() {
        $scope.uname = $rootScope.n;
    } 
});

両方のコントローラーが同時にインスタンス化する場合は、@aw04 が $broadcaste、$on、および $emit を使用して提案したように、偶数ベースの通知を使用する必要があります。

于 2016-01-27T17:13:53.170 に答える