2016-06-29 6 views
1

私はコントローラと工場を持っています。ファクトリ(searchFactory)内の関数(myfunc)は、ボタンのng-clickによって呼び出されます。その後、私は関数の外にある関数(waitfunction)を呼び出します。その機能では、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-i-return-the-response-from-an-asynchronous-call – elclanrs

答えて

0

あなたがsetTimeout関数を使用して$タイムアウト

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

を使用する必要があるが、角度のダーティチェックをバイパスします。角度ダーティチェック以外で非同期機能を使用する場合は、ダーティチェックを再度実行するために角度をトリガする必要があります。角度すでにデフォルトのJavaScriptのものを置き換えるために、非同期メソッドの数を持っていると私はあなたをお勧めしたい -

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

あなたの特定のニーズのために:あなたは$scope.$apply();したり、非同期呼び出しは、このような関数でラップを呼び出すことによってそれを行うことができます代わりのJavaScriptの使用はタイムアウト:

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

あなたがここに$タイムアウトについての詳細を読むことができます:https://docs.angularjs.org/api/ng/service/ $タイムアウト

あなたwaitfunctionは、あなたはそれが何をしたいのかやっているようには見えません。タイムアウトが変更される前に値が返されます。これは単純な値を参照しているだけなので発生します。あなたがオブジェクトを渡して、そのプロパティをオブジェクト変更した場合、その後、あなたは何をしようとして達成することができます:

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

をあなたは、代わりに返すオブジェクト.valueプロパティにバインドする必要があります。

私はあなたのプランカを見て、やるべきことがたくさんあります。結果として得られるオブジェクトを何かに束縛しているようには見えません。私はこの投稿が、setTimeoutの呼び出しと単純な値へのバインディングの問題に関連する少なくとも非同期の問題を解決するのに役立つと考えています。

+0

エラー:$ scopeは定義されていません –

+0

私もPlunker –

+0

@ZohairZahidを更新しました。あなたの例でやるべきことがたくさんあるので、どこから始めたらいいかわかりません。 $ scopeの$ timeoutへの呼び出しを$ scopeにラップする必要はありません。あなたの$ scopeが未定義の理由は、それがあなたのコントローラにないからです。待機中の値はどこにも使用していません。私は何もしていない、たくさんのものを見ています。 –

関連する問題