每当打开/显示视图时运行控制器function

我正在构build一个angular度+离子的应用程序,在底部使用一个经典的三键菜单,其中有三个离子选项卡。 当用户点击一个标签时,该模板通过UI路由器打开。

我有这样的状态:

$stateProvider .state('other', { url: "/other", abstract: true, templateUrl: "templates/other/other.html" }) 

在模板中,我做的是这样的:

 <ion-nav-view name="other" ng-init="doSomething()"></ion-nav-view> 

我知道我可以在我的控制器中写入doSomething()函数,并在那里手动调用它。 这给了我同样的问题,但。 我似乎无法找出如何打开doSomething()函数多次,只要有人打开该视图。

现在,doSomething()函数被调用的很好,但只有在用户第一次打开view / tab的时候。 我想调用一个函数(更新地理位置),只要用户打开该视图或标签。

什么将是一个正确的方式来实现呢?

感谢您的帮助!

如果你已经为你的视图分配了一个特定的控制器,那么每当你的视图加载的时候你的控制器就会被调用。 在这种情况下,只要调用它就可以在控制器中执行一些代码,例如:

 <ion-nav-view ng-controller="indexController" name="other" ng-init="doSomething()"></ion-nav-view> 

在您的控制器中:

 app.controller('indexController', function($scope) { /* Write some code directly over here without any function, and it will be executed every time your view loads. Something like this: */ $scope.xyz = 1; }); 

编辑:你可能试图跟踪状态变化,然后执行一些代码,当路线改变,并访问了一定的路线,例如:

 $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ ... }) 

你可以在这里find更多的细节: 状态改变事件 。

默认情况下,你的控制器是caching,这就是为什么你的控制器只发射一次。 要closures某个控制器的caching,您必须修改.config(..).state并将cache选项设置为false 。 例如:

  .state('myApp', { cache: false, url: "/form", views: { 'menuContent': { templateUrl: "templates/form.html", controller: 'formCtrl' } } }) 

进一步阅读,请访问http://ionicframework.com/docs/api/directive/ionNavView/

继续从AlexMart的答案和链接,这样的工作:

 .controller('MyCtrl', function($scope) { $scope.$on('$ionicView.enter', function() { // Code you want executed every time view is opened console.log('Opened!') }) }) 

我面临同样的问题,在这里,我留下了这个行为的原因,为所有其他人都有同样的问题。

查看LifeCycle

为了提高性能,我们改进了Ioniccaching视图元素和范围数据的能力。 一旦控制器初始化,它可能会持续整个应用程序的生命; 它只是隐藏并从观看周期中删除。 由于我们不重build范围,因此我们在再次进入观看周期时添加了我们应该听的事件。

要查看完整说明和$ ionicView事件,请访问: http ://ionicframework.com/blog/navigating-the-changes/

比如说@迈克尔·特劳,

在你的控制器里面放这个代码。 这个状态每次进入或者活动的时候都会运行,所以你不需要担心禁用caching,这是一个更好的方法。

 .controller('exampleCtrl',function($scope){ $scope.$on('$ionicView.enter', function(){ // Any thing you can think of alert("This function just ran away"); }); }) 

你可以有更多的例子,比如$ ionicView.beforeEnter – >,它在显示视图之前运行。 还有一些更多。

为什么不用cache-view =“false”来禁用视图caching?

在你的视图中添加这样的离子导航视图像这样:

 <ion-nav-view name="other" cache-view="false"></ion-nav-view> 

或者在你的stateProvider中:

 $stateProvider.state('other', { cache: false, url : '/other', templateUrl : 'templates/other/other.html' }) 

任何一个都会让你的控制器总是被调用。

考虑到Ionic能够caching上面提到的视图元素和范围数据,这可能是另一种方式,如果你想在每次加载视图的时候运行控制器。 您可以通过全局禁用离子使用的caching机制:

$ionicConfigProvider.views.maxCache(0);

否则,我为我工作的方式就是这样做

 $scope.$on("$ionicView.afterLeave", function () { $ionicHistory.clearCache(); }); 

这是清除caching之前,每次你再次回到视图重新运行控制器。

这可能是你正在寻找的:

离子caching您的意见,因此默认你的控制器(最多10) http://ionicframework.com/docs/api/directive/ionView/

有些事情可以挂钩让你的控制器根据这些离子事件做某些事情。 在这里看一个例子: http : //ionicframework.com/blog/navigating-the-changes/

我有一个类似的问题与离子,我试图加载本地摄像机,只要我select相机选项卡。 我通过将控制器设置为相机选项卡的离子视图组件(在tabs.html中),然后调用加载相机的$ scope方法(addImage)来解决问题。

在www / templates / tabs.html中

  <ion-tab title="Camera" icon-off="ion-camera" icon-on="ion-camera" href="#/tab/chats" ng-controller="AddMediaCtrl" ng-click="addImage()"> <ion-nav-view name="tab-chats"></ion-nav-view> </ion-tab> 

AddMediaCtrl中定义的addImage方法会在用户每次单击“Camera”选项卡时加载本地摄像机。 我没有改变angular速度caching中的任何东西,为此工作。 我希望这有帮助。