1

私は AngularJS が初めてで、何時間も費やした後でも、インターネット上で以下の問題に対する答えを見つけることができません。

私が以下で試していることを、より良い方法で提案してください。

私の AngularJS の進行中のコードを参照してください。

<li ng-repeat="result in getResults()" ng-controller="resultController"> 
 <div class="name_style">
  {{result.name}}
 </div>

  <!--fetch more details for each result and set to $scope.resultDetail-->
 <div class="name_detail_style" ng-bind=getDetails(result.name) ng-controller="resultDetailController">
  {{resultDetail.image}}
  {{resultDetail.description}}
 </div>

</li>    

簡潔にするために、上記を単純化しようとしました。

結果のリストを 2 つの部分でレンダリングしようとしています。

  1. getResuls() は、残りのサービスを呼び出して結果の配列を取得します。

  2. 次に getDetails(result) が別のサービス呼び出しを行い、特定の結果の詳細を取得します。

AngularJS が名前とその詳細の両方を同時にレンダリングしようとするため、実行が非常に遅くなります。名前が利用可能になるとすぐにレンダリングし、 getDetail() サービス呼び出しが応答を返す機会を得るたびに詳細をレンダリングします。

このソリューションを使用できるかどうか/どのように使用できるか わかりませんSpringMVCでAngularJSを使用してデータを非同期にロードする方法は?

コントローラー側のコードも表示する必要がある場合はお知らせください。

EDITコントローラーコードの例も追加します。以下のコードを手動で再作成する際のタイプミスをお許しください。

function resultController($scope, $http) {
    $scope.getResults = function() {

        $http({method: 'GET', url: resultURL=  timeout: maxTime})
            .success(function (data, status, headers, config) {
               console.log(data);
               $sope.result=data;     
            })

            .error(function (data, status, headers, config) {
                if (status == 0) {
                    serviceTimedoutError($scope, data, status, config);
                } else {
                    serviceFailure($scope, data, status, config);
                }
            })
    };

};



function resultDetailController($scope, $http) {
    $scope.getDetails = function(result) {
          resultDetailsURL=resultDetailsUR+"/"+result  
        $http({method: 'GET', url: resultDetailsURL=  timeout: maxTime})
            .success(function (data, status, headers, config) {
               console.log(data);
           $sope.resultDetails={"image":data["image"],"description":data["description"]};     
            })

            .error(function (data, status, headers, config) {
                if (status == 0) {
                    serviceTimedoutError($scope, data, status, config);
                } else {
                    serviceFailure($scope, data, status, config);
                }
            })
    };

};
4

2 に答える 2

1

http://plnkr.co/edit/nTI58uAkUfE3pw2yjy9qでaa plunk を作成しました。これは、サービスとディレクティブを使用して、あなたが話している結果を達成する方法を示しています。重要なのは、ID がディレクティブに関連付けられるのは、ディレクティブのリンク時であるということです。次に、detailId の $watch を使用して、2 番目の呼び出しをトリガーします。

これをプロジェクト全体で使用するには、サーバーからコンテンツを取得するために $http または $resource 呼び出しを使用するようにサービスを更新する必要があります。

于 2013-05-19T19:37:06.487 に答える
1

基本的にテンプレート内の AJAX 呼び出しラッパー関数を参照することはできません (つまり、参照すべきではありません)。それが「角度のある方法」ではないことを気にしないでください(テンプレートはデータを台無しにするべきではなく、ng-repeatがajax関数を呼び出しているものです)、AJAX呼び出しを行っているため(そしてそれぞれにもう1つ返された配列の要素!) 各レンダー サイクル!

バックエンド/APIから情報を取得するタイミングを制御し、更新/変更をコミットするまでそれを操作できる必要があります(おそらくそうする必要があります)。したがって、主に変更する必要があるのは次のとおりです。

<li ng-repeat="result in getResults()" ng-controller="resultController"> 

<li ng-repeat="result in myResults" ng-controller="resultController"> 

そしてresultControllerへ:

function resultController($scope, $http) {
    $scope.getResults = function() {

        $http({method: 'GET', url: resultURL=  timeout: maxTime})
            .success(function (data, status, headers, config) {
               console.log(data);
               $sope.result=data;     
            })

            .error(function (data, status, headers, config) {
                if (status == 0) {
                    serviceTimedoutError($scope, data, status, config);
                } else {
                    serviceFailure($scope, data, status, config);
                }
            })
    };

    $scope.myResults = $scope.getResults();

};

これが行うことは、コントローラーがインスタンス化されたときにAJAX リクエストを一度呼び出すことです。

次に、resultDetailController に対して同じことを行うことができますが、それが価値があるかどうかを検討してください。主な結果が大幅に変更される可能性が低い場合 (変更されるたびに要求が繰り返される)、または詳細が大量のデータを表し、構造をすばやく表示する必要がある場合にのみ、これらの呼び出しを分離する必要があります。そしてその時だけ、詳細。

また、たとえばユーザーが要素を「開いた」場合にのみ、要素の詳細を呼び出すことを検討してください。

編集、以下のコメントへの応答

前述したように、情報 (モデル、およびそれを取得して更新するための AJAX 要求) は、テンプレート化と表示から分離する必要があります。とはいえ、何が最適かを判断する必要があります。

  • 前もってすべての情報を取得し、後でフィルタリングする (表示されているもののみをフィルタリングする) または
  • バックエンドからフィルタリングされた要素のセットを取得できます

2 番目のケースでは、AJAX 呼び出しが発生する頻度を制御する必要があります。たとえば、( $scope.$watch() を使用して) フィルター変数を監視し、それが発生したときに $http サービスを呼び出すことができます。

(resultController:)

$scope.$watch("filterString", function(){
  $scope.myResults = $scope.getResults($scope.filterString);
}

フィルター「検索ボックス」に何かを入力するたびに、新しいリクエストが作成されることに注意してください(これはやり過ぎで、誤った結果につながることさえあります-「beac」のリクエストが「のリクエストのに返される場合」ビーチ」など)。考えられる解決策の 1 つは、入力時に以前のタイムアウトをオーバーライドするタイムアウトを実装することです (検索は、入力を停止してから 0.5 秒後に開始されます)。

$scope.$watch("filterString", function(){
  $scope.getResultsTimeout.cancel();
  $scope.getResultsTimeout = $timeout(
    function(){
      $scope.myResults = $scope.getResults($scope.filterString);
    },
    500);
}
于 2013-05-20T01:05:56.240 に答える