2017-02-15 17 views
0

私はAngularJS(Angular1)を使って小さなSPAを持っています。私はしばらくの間、ページ全体をリフレッシュする必要があります。 SPAはREST呼び出しからデータを取得しますが、ページの更新ではアプリの変更が随時行われます。 「メタリフレッシュ」タグを使用するのは基本的には機能しますが、ネットワークにアクセスできない場合(たとえば職場と家庭の間を移動するなど)にページをリフレッシュしようとすると少し厄介な兆候があるため、エラーになります状態。私が接続しているときに手動でページを更新するのは簡単ですが、ちょっとスマートだったと思います。HTMLのスクリプトブロックからAngularJSコントローラメソッドを呼び出す方法

「メタリフレッシュ」タグの代わりに、コントローラに「HeartbeatService」ファクトリメソッドを定義し、そのコントローラメソッドをコントローラから直接呼び出すことを目的としてコントローラにメソッドを呼び出すメソッドを定義しました。 HTMLページのスクリプトブロックを使用して、ページをリロードするかどうかを判断します(インターバルタイマーが起動したとき)。

コントローラのコーディングは大丈夫だと思いますが、スコープを正しく取得してスクリプトブロックから直接メソッドを呼び出す方法を理解できません。

これは、この時の私の最初のカットです:

<body data-ng-controller="MyController"> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-animate.js"></script> 
    <script type="text/javascript" src="js/myMod.js"></script> 
    <script type="text/javascript" src="js/myApp.js"></script> 
    <script type="text/javascript"> 
     window.setInterval(function() { 
      if (angular.element($('#MyController')).scope().heartbeat()) { 
       window.location.reload(); 
      } 
     }, 60000) 
    </script> 

私は「angular.element()」の呼び出しにブレークポイント(放火魔)を設定しようとしたので、私は、コンソールからこののバリエーションを呼んで実験ができ。これまでのところ、私は動作するものは見つかりませんでした。

更新

提供の答えは、私は、「ID」を設定する必要がなかったことを意味し、「document.body」を、言及するのに役立ちました。私の今の作業スクリプトブロックは次のようになります。

<script type="text/javascript"> 
    window.setInterval(function() { 
     // Call controller method to call heartbeat service. 
     if (angular.element(document.body).scope().heartbeat()) { 
      window.location.reload(); 
     } 
    }, 900000) 
</script> 
+1

を呼び出すためにinjectorを使用すると、正しく見える...実際のエラーは何ですか?そして実際にはMyControllerというIDの要素がありますか? IDを追加するのを忘れてしまったようです。「body id = "MyController" data-ng-controller = "MyController" ' - あなたは角度コントローラーの外でこれをやっていますか? – tymeJV

答えて

1

私はあなただけのHeartbeatServiceを呼び出すためにMyController方法を定義する必要が推測していません。

ではなく、上記のサービスのインスタンスを取得し、その方法

<script type="text/javascript"> 
    var $injector = angular.element(document.body).injector(); 
    var service = $injector.get('HeartbeatService'); 

    window.setInterval(function() { 
     if (service.someMethod()) { 
      window.location.reload(); 
     } 
    }, 60000) 
</script> 
+0

実際、この答えの最も重要な部分は "document.body"でした。私はここから呼び出されるコントローラメソッドを定義することを好むので、それ以外のものは私には役に立ちませんでしたが、現在は機能していますので、それが必要です。 –

関連する問題