AngularJS不断从html模板调用$ http.get,但不是从控制器内调用?

时间:2012-10-17 22:02:57

标签: http get angularjs

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);

            });

知道我做错了什么吗?

1 个答案:

答案 0 :(得分:4)

您的{{ }}绑定代码中的表达式将随时重新评估Angular注意到模型中的某些内容发生了变化(我已经过度简化了实际发生的情况)。如果您只想将getContexts调用一次,请不要将其放入标记中的{{ }}内,只需在控制器代码中调用它即可。

基本上假设{{ }}内的代码可以多次调用..

所以尝试删除:

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

依赖你的控制器代码(如果你没有从你的标记中调用它,你可能不希望你的范围内有getContexts):

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