我有一个控制器和一个工厂。通过单击按钮调用工厂内的函数(myfunc)(searchFactory)。之后我调用一个在conntroller外面的函数(waitfunction)。在该功能中,使用2秒的超时,然后更改一个值并返回给控制器。如何在2秒后确保控制器中的值已更新。 JSfiddle:http://jsfiddle.net/zohairzohair4/cRr9K/1334/
var search_name
var angularjsapp = angular.module('graphApp', ['ngAnimate', 'ui.bootstrap']);
angularjsapp.factory('searchFactory', function() {
//return $resource('friends.json');
return{
myfunc:function(search_name){
console.log('ok')
keyword_type = 1
loading_value = waitfunction(search_name)
console.log(loading_value)
return loading_value
}
}
});
angularjsapp.controller('AccordionDemoCtrl', function($scope,searchFactory) {
$scope.count = 0;
$scope.namesPerPage = 10
$scope.currentPage = 1;
$scope.searchFactory = searchFactory.myfunc
});
function waitfunction(search_name){
value = 0
window.setTimeout(function () {
value = 1;
}, 2000);
return value
};
答案 0 :(得分:1)
使用setTimeout函数将绕过角度的脏检查。如果要在angulars dirty-checking之外使用异步功能,则需要触发angular再次进行脏检查。您可以通过调用$scope.$apply();
或使用以下函数包装异步调用来执行此操作:
$scope.$apply(function() {
...
});
根据您的具体需要 - angular已经有一些异步方法来替换默认的javascript,我建议您使用它而不是javascripts超时:
$timeout(function () {
value = 1;
}, 2000);
您可以在此处详细了解$ timeout:https://docs.angularjs.org/api/ng/service/ $ timeout
你的等待功能似乎没有做你想做的事情。它将在超时更改之前很久返回该值。发生这种情况是因为您只是引用了一个简单的值。如果您传递一个对象并修改该对象属性,那么您可以实现您想要做的事情:
function waitfunction(search_name){
var obj = { value: 0 };
$timeout(function () {
obj.value = 1;
}, 2000);
return obj;
};
然后,您需要绑定到返回的对象.value
属性。
我看到了你的掠夺者,还有很多工作要做。你似乎并没有将结果对象绑定到任何东西上。我认为这篇文章有助于解决至少与调用setTimeout相关的异步问题以及绑定到简单值的问题。
答案 1 :(得分:0)
您需要使用$ timeout
$timeout(function() {
value=1;
}, 2000);