2016-09-07 9 views
1

AngularJSのルーティング機能を使用しています。さらに、私はすべてのテンプレート用のコントローラーだけを欲しがっています。AngularJS - ルーティングコンテキストでコントローラーの機能を1回だけ実行する方法

私のコントローラでangularJsController私はinitの機能を持っています。これは、コントローラが初めて実行されたときと、明示的に関数を呼び出すときに実行する必要があります。しかし、ルーティングが別のテンプレートを読み込むたびにinit関数が実行されることはありません。

希望の動作を達成するにはどうすればよいですか?

var app = angular.module("angularJsApplication", ["ngRoute"]); 

app.config(function($routeProvider) { 
    $routeProvider 
     .when("/overview", { 
      templateUrl : "overview.html", 
      controller : "angularJsController" 
     .when("/settings", { 
      templateUrl : "settings.html", 
      controller : "angularJsController" 
     ... 
}); 

app.controller("angularJsController", function ($scope, $location, $http) { 
    $scope.init = function() { 
    //do stuff 
    }; 
} 
+2

app.factory("initService", [function() { var returnObject = {} // set properties of returnObject // do something like this if you need "explicitly call the function" returnObject.recaculate = function() { // perform recaculations } return returnObject; }]); 

は、コントローラ(複数可)にサービスを注入することを忘れないでください。 – Dave

+0

まず、これが何のためのサービスなのですか。サービスはシングルトンなので、一度しか初期化されません。 2つ目は、複数のルートで同じコントローラを使用することは絶対に避けてください。 – Claies

+1

@Claiesでは、複数のルートで同じコントローラを使用しないと言う理由を説明できますか?私は過去のw/outの問題でこれをやったことがあります。ちょっと不思議なことに、コントローラを再利用することは完全に受け入れられるようです。 –

答えて

0

一度だけ実行する必要のあるサービスを作成します。サービスはシングルトンとして格納されますが、コードを再実行するための1つ以上の方法を提供できます。角度サービスのためのものであるかのほぼ完璧な例です

app.controller("angularJsController", ["$scope", "$location", "$http", "initService", function ($scope, $location, $http, initService) { 
    // controller contents 
    $scope.reInit = function() { 
     initService.recaculate(); 
    } 
}]); 
関連する問題