0

Web ページの読み取り時にチェックを行い、その結果を使用して ng-repeat でサイドバーを更新しましたが、エラーが発生しました:

キャッチされないエラー: 不明なプロバイダー: myModule からの $scope または キャッチされないエラー: 不明なプロバイダー: sharedService からの $scope

どうすれば解決できますか?

これが私のコードです

モジュール:

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

放送用サービス:

myModule.factory('mySharedService', function($rootScope) { //service
    var sharedService = {};

    sharedService.keyHistory = [];
    sharedService.linkHistory = [];
    sharedService.prepForBroadcast = function(key,link) {
        this.keyHistory = key;
        this.linkHistory = link;
        this.broadcastItem();
    };

    sharedService.prepForBroadcastAdd =function(key){
        console.log(this.keyHistory.push(key));
        //this.linkHistory = linkHistory+link;
        this.broadcastItem();
    };

    sharedService.broadcastItem = function() {
        $rootScope.$broadcast('handleBroadcast');
    };

    return sharedService;
});

確認する構成:

myModule.config(function($scope,sharedService){

        $.ajax({
            url:"/fly/AJAX",
            type:"POST",
            contentType:'application/x-www-form-urlencoded; charset=UTF-8',     
            datatype:"json",
            success:function(data){
                if(data!=null){
                var loginResult = $.parseJSON(data);


                if (loginResult.success == true){ 
                    console.log("login success");
                    $("#userLable").html(loginResult.userName+'('+loginResult.loginID+')');//
                    if (loginResult.hasHistory==true) {  
                        sharedService.prepForBroadcast(loginResult.searchHistory,[]);
                        console.log("broadcast");
                    }
                    };
                }
            }
    });

});

サイドコントロール:

function SideCtrl($scope,sharedService) {
    $scope.$on('handleBroadcast', function() {

    $scope.keyHistory =sharedService.keyHistory;
    $scope.linkHistory = sharedService.linkHistory;
    });        

}

SideCtrl.$inject = ['$scope', 'mySharedService'];

THX !

4

2 に答える 2

1

このエラーは、構成ブロックで a を要求しようとしたために発生し$scopeますが、これは実行できません。あなたがやろうとしていることを私が理解しているなら、あなたはそれを過度に複雑にしていると思います. 私は問題を少し違った方法で解決します。詳細は要件とユースケースによって異なりますが、提供した情報に基づいて...

サーバーとの通信と状態の保存を担当するサービスがあります。

app.factory( 'loginService', function ( $http ) {
  var result;

  function doRequest( data ) {
    // just flesh out this post request to suit your needs...
    return $http.post( '/fly/ajax', data, {} )
    .then( function ( response ) {
      // assuming you don't care about the headers, etc.
      return response.data;
    });
  }

  // Do it once initially
  if ( ! angular.isDefined( result ) ) {
    result = doRequest();
  }

  // return the service's public API
  return {
    getStatus: function () { return result; },
    login: doRequest
  };
});

これで、このサービスが初めて要求されたときに、$http要求が行われます。複数のコントローラーからこれにアクセスしている場合、isDefinedステートメントにより、ポストは 1 回だけ発生します。次に、これをコントローラーで使用できます。

app.controller( 'MainCtrl', function( $scope, loginService ) {
  loginService.getStatus().then( function ( data ) {
    // do whatever you need to with your data. 
    // it is only guaranteed to exist as of now, because $http returns a promise
  });
});

すべてのコントローラーは同じ方法でアクセスしますが、まだ 1 回しか呼び出されていません! 必要に応じて、スコープに対して値を設定し、ビューからアクセスできます。

app.controller( 'MainCtrl', function( $scope, loginService ) {
  loginService.getStatus().then( function ( data ) {
    $scope.loginId = data.loginID;
  });
});

そしてあなたの見解では:

<h1>Welcome, {{loginId || 'guest'}}!</h1>

必要に応じて、関数を再度呼び出します。

app.controller( 'MainCtrl', function( $scope, loginService ) {
  // ...
  loginService.login( $scope.user ).then( function ( data ) {
    $scope.loginId = data.loginID;
  });
  // ...
});

ご覧のとおり、イベントのブロードキャストはまったく不要です。

于 2013-02-19T07:48:41.667 に答える
0

私はそれを別の方法で行います。body:のように、ある種のよりトップレベルのコントローラーを作成し、function MainController($rootScope, $scope, sharedService)それを body: と結び付けます<body ng-controller='mainController' ng-init='init()'。その後、 でinit()メソッドを作成する必要がありますMainController

この初期化メソッド内sharedServiceで、AJAX リクエストを作成し ( $http! を使用するのがベスト プラクティスであり、jQuery と非常によく似ています)、必要に応じて適切なイベントをブロードキャストするメソッドを呼び出します。

そうすることで、初期化を 1 回だけ呼び出すようにし (MainController初期化中のとき)、Angular のベスト プラクティスに固執し、危険なコードを回避します。

于 2013-02-19T06:49:03.207 に答える