angularjs:变量的更新值在外部超时函数调用之后

时间:2016-06-29 12:09:58

标签: javascript angularjs

我有一个控制器和一个工厂。通过单击按钮调用工厂内的函数(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        
        };

2 个答案:

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