2016-06-29 2 views
1

У меня есть контроллер и завод. Функция (myfunc) внутри фабрики (searchFactory) вызывается ng-кликом кнопки. после чего я вызываю функцию (waitfunction), которая находится за пределами conntroller. В этой функции используется тайм-аут в 2 секунды, после чего значение изменяется и возвращается контроллеру. Как я могу убедиться, что значение обновляется в контроллере через 2 секунды. JSfiddle: http://jsfiddle.net/zohairzohair4/cRr9K/1334/angularjs: обновить значение переменной После вызова внешней функции таймаута

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

Звучит как дубликат этого http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call – elclanrs

ответ

0

Вы должны использовать $ таймаута

$timeout(function() { 
       value=1; 
      }, 2000); 
1

Использование функции SetTimeout обойдет грязную проверку угловой х. Если вы хотите использовать асинхронную функциональность за пределами грязной проверки углов, вам нужно вызвать углы, чтобы снова выполнить грязную проверку. Вы можете сделать это по телефону $scope.$apply(); или обернуть асинхронный вызов с помощью функции, как это:

$scope.$apply(function() { 
... 
}); 

Для ваших конкретных потребностей - Угловой уже есть ряд асинхронных методов, чтобы заменить стандартные JavaScript те, и я хотел бы предложить вам Ваш waitfunction не кажется https://docs.angularjs.org/api/ng/service/ $ тайм-аут

делать то, что вы хотите сделать: использовать что вместо JavaScripts тайм-аут:

$timeout(function() { 
    value = 1; 
}, 2000); 

вы можете прочитать больше о $ таймаут здесь. Он вернет значение задолго до истечения таймаута. Это происходит потому, что вы просто ссылаетесь на простое значение. Если передать объект и изменить что объекты собственности, то вы можете добиться того, что вы пытаетесь сделать:

function waitfunction(search_name){ 
    var obj = { value: 0 }; 
    $timeout(function() { 
     obj.value = 1; 
    }, 2000); 
    return obj;  
}; 

Затем нужно связать возвращающиеся объекты .value свойства вместо этого.

Я вижу ваш плункер, и предстоит много работы. Не похоже, что вы привязываете результирующий объект ко всему. Я думаю, что это сообщение помогает решить проблему async, связанную с вызовом setTimeout и проблему привязки к простым значениям.

+0

Ошибка: $ scope не определен –

+0

Я также обновил Plunker –

+0

@ ZohairZahid в вашем примере так много работы, я не знаю с чего начать. Вам не нужно завершать вызов $ timeout в $ scope. $ Apply. Причина, по которой ваш $ scope не определен, заключается в том, что он не в вашем контроллере. Вы не используете значение из ожидаемого места. Я вижу, что много кода ничего не делает, и многие вещи не подключены ... –

Смежные вопросы