【问题标题】:AngularJS calls $http.get constantly from html template, but not from within controller?AngularJS 不断地从 html 模板调用 $http.get,而不是从控制器内部调用?
【发布时间】:2012-10-17 22:02:57
【问题描述】:

AngularJS 不断地调用 http get 请求!!

如果我直接在控制器中调用 getContexts 没问题...但如果我从 html template 调用它,它只会继续调用 get。

部分上下文Ctrl.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);

            });

知道我做错了什么吗?

【问题讨论】:

    标签: http get angularjs


    【解决方案1】:

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

    基本上假设{{ }} 中的代码可以并且将会被多次调用..

    所以尝试删除:

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

    并依赖您的控制器代码(尽管如果您不从标记中调用它,您可能不希望 getContexts 在您的范围内):

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

    【讨论】:

    • 您好 Gloopy,感谢您的提示!只从 AngularJS 开始,所以还在学习......我将它与 Play 2 Framework 一起使用,所以我的模板开头有类似 @(product: models.product.Product) 的东西,其中包含我想要的 @product.contextIds将它传递给该控制器方法......所以模板中的真实代码是 {{getContexts('["@product.item.contextIds.mkString("\", \"")"]')} }
    • 不确定这是否有帮助(这绝对是 hacky),但如果您在服务器端生成数据,您可以将其复制到 Angular 范围/模型(通过指令),然后您的控制器根据这些模型值检索数据。有关此类指令的信息,请参阅此答案:stackoverflow.com/a/11839256/1207991。如果您可以通过 url 传递输入并使用 $location、$route 或 $routeParams 提取它,那可能是最好的。
    • 感谢您的链接...是的,这似乎有点骇人听闻,但也许是一个后备选项。当然其他人需要做我想做的事情,将一些服务器端值发送到控制器方法中?您能否指出一个链接 re {{ }} 正在不断重新评估?有兴趣阅读更多关于这...
    • 它们不会被不断地重新评估,而是在作用域生命周期的 $digest 阶段。阅读更多关于数据绑定脏检查here。另请参阅 Scope$digest。在您的情况下,我假设 $http.get 设置 $scope.contexts 上的成功回调启动另一个 $digest 处理观察者(其中一个将是您的 {{getContexts(...)}})以查看是否有任何内容需要在视图中更新的更改。
    • 现在说得通了,感谢一百万的帮助......这真的开始让我烦恼了。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多