我需要在作用域中有一个函数,其结果将异步更改。
必须有一个函数用作表达式,所以我不能使用单个属性。
在我的示例中,该函数返回一个对象的属性,该对象将被异步修改。这将执行一个摘要错误,尽管该值在整个摘要周期中是相等的。下面是一个例子:http://plnkr.co/edit/YmyroMiMyMzUaLW4tc7V(注意:可能会挂起浏览器)
myApp.controller('Ctrl1', ['$scope', '$http', function($scope, $http) {
var myObj = {found:false};
$scope.util = {};
$scope.util.asyncFunc = function(){
$http.get('http://localhost').then(changeValue,changeValue);
return myObj.found;
}
function changeValue(){
myObj.found = true;
}
}]);
你知道怎么解决吗?
我有一个解决方案,问题是执行所有的时间$http。得到,它创造的承诺将在同一时间得到解决。首先,我通过检查promise是否已经创建来解决这个问题。之后在回调的承诺,我设置我的var控制,如果承诺被创建为null,但我重新定义的函数做一种桥返回相同的值,以避免执行$http。获取相同的$digest:http://plnkr.co/edit/LOXDzVC4do2GTRtyNgSU
var myApp = angular.module('myApp', []);
//nueva 2015-06-09
myApp.controller('Ctrl1', ['$scope', '$http', '$q', function($scope, $http, $q) {
var myObj = {found:false};
$scope.util = {};
var pro;
$scope.util.asyncFunc = doGet;
function doGet(param1, param2){
if(!pro){
pro = $http.get('http://localhost').then(changeValue,changeValue);
}
return myObj.found;
function changeValue(){
if(param1 !== "2"){
myObj.found = true;
}else{
myObj.found = false;
}
$scope.util.asyncFunc = function(param1, param2){
$scope.util.asyncFunc = doGet;
pro = null;
return myObj.found;
}
}
}
}]);
和html:
<body>
<div ng-controller="Ctrl1">
<br/><br/>
Param1:<input type="text" ng-model="model.param1" />
Param2:<input type="text" ng-model="model.param2" />
AsyncFunc: {{util.asyncFunc(model.param1, model.param2)}}
</div>
<script src="http://code.angularjs.org/1.2.26/angular.js"></script>
<script src="script.js"></script>
</body>
嗯,我认为这肯定不是最好的解决方案,如果你有其他的方法会很有帮助。