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);
});
知道我做错了什么吗?
答案 0 :(得分:4)
您的{{ }}
绑定代码中的表达式将随时重新评估Angular注意到模型中的某些内容发生了变化(我已经过度简化了实际发生的情况)。如果您只想将getContexts
调用一次,请不要将其放入标记中的{{ }}
内,只需在控制器代码中调用它即可。
基本上假设{{ }}
内的代码可以多次调用..
所以尝试删除:
// This causes get to keep calling!
{{getContexts('["context::one", "context::two"]')}}
依赖你的控制器代码(如果你没有从你的标记中调用它,你可能不希望你的范围内有getContexts
):
// This works
$scope.getContexts('["context::one", "context::two"]')