1

AngularJS は http get リクエストを何度も呼び出し続けます!!

コントローラーで getContexts を直接呼び出すと問題ありませんが、 からhtml template呼び出すと、get を呼び出し続けるだけです。

部分的な contextCtrl.js:

            'use strict';

            app.controller('ContextCtrl', function ContextCtrl($scope, $location, $http, $rootScope, ContextService) {  
                $scope.getContexts = function(keys)
                {
                    $scope.contexts = {};
                    $http.get('/getContextsWS?keys=' + keys).
                    success(function(data){
                      $scope.contexts = data;
                    });
                }

                // This works
                $scope.getContexts('["context::one", "context::two"]')
            });

部分的な HTML セクション:

            <section id="contextSection" ng-controller="ContextCtrl">

                // This causes get to keep calling!
                {{getContexts('["context::one", "context::two"]')}}

                // Just checking
                {{contexts|json}}

                <nav>
                    <ul ng-show="contexts.length" ng-cloak>
                        <li ng-repeat="context in contexts">
                            <div class="view" ng-click="contextSelected(context)">{{context.name}}</div>
                        </li>
                    </ul>
                </nav>
            </section>

これは私を夢中にさせています!

さて、あなたの非表示フィールドの例を試してみましたが、うまくいかないようですが、おそらく何かが欠けています...

html:

            <section id="contextSection" ng-controller="ContextCtrl">
            <input type="hidden" ng-model="contextIds" copy-to-model value='@product.item.contextIds'/>

ディレクティブ:

            mto.directive('copyToModel', function ($parse) {
                return function (scope, element, attrs) {
                    $parse(attrs.ngModel).assign(scope, attrs.value);
                }
            });

コントローラー:

            app.controller('ContextCtrl', function ContextCtrl($scope, $location, $http, $rootScope, ContextService) {  

                // I can read this, but it never changes, and without this the contextIds in the alert are null
                $scope.contextIds = "...";

                $rootScope.alert = function(text)
                {
                    alert(text);
                }

                $rootScope.alert("$scope.contextIds: " + $scope.contextIds);

            });

私は何が間違っているのですか?

4

1 に答える 1

4

バインディング コード内の式は、{{ }}Angular がモデル内の何かが変更されたことに気付くたびに再評価されます (実際に何が起こるかを単純化しすぎています)。一度だけ呼び出したい場合は、マークアップgetContextsに入れずに{{ }}、コントローラー コードで呼び出してください。

基本的に、内部のコード{{ }}は複数回呼び出される可能性があり、呼び出されると想定しています..

だから削除してみてください:

// This causes get to keep calling!
{{getContexts('["context::one", "context::two"]')}}

そして、コントローラー コードに依存します (ただしgetContexts、マークアップから呼び出さない場合は、スコープに含めたくない場合があります)。

// This works
$scope.getContexts('["context::one", "context::two"]')
于 2012-10-17T22:11:51.943 に答える