Angularjs 每当打开/显示视图时,运行控制器功能
我正在用angular+ionic构建一个应用程序,它在底部使用一个经典的三按钮菜单,其中有三个离子标签。当用户单击选项卡时,该模板将通过ui路由器打开 我有这样的州:Angularjs 每当打开/显示视图时,运行控制器功能,angularjs,ionic-framework,Angularjs,Ionic Framework,我正在用angular+ionic构建一个应用程序,它在底部使用一个经典的三按钮菜单,其中有三个离子标签。当用户单击选项卡时,该模板将通过ui路由器打开 我有这样的州: $stateProvider .state('other', { url: "/other", abstract: true, templateUrl: "templates/other/other.html" }) 在模板中,我执行以下操作: <ion-nav-view name="othe
$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()函数可以很好地调用,但只有在用户第一次打开视图/选项卡时才调用。每当用户打开视图或选项卡时,我想调用一个函数(更新地理位置)
实现这一点的正确方法是什么
谢谢你的帮助 如果已将某个控制器分配给视图,则每次加载视图时都会调用控制器。在这种情况下,您可以在调用控制器后立即在控制器中执行某些代码,例如:
<ion-nav-view ng-controller="indexController" name="other" ng-init="doSomething()"></ion-nav-view>
编辑:您可以尝试跟踪状态更改,然后在更改路由和访问某个路由时执行一些代码,例如:
$rootScope.$on('$stateChangeSuccess',
function(event, toState, toParams, fromState, fromParams){ ... })
你可以在这里找到更多的细节:。我面临同样的问题,在这里我把这种行为的原因留给其他有同样问题的人 查看生命周期 为了提高性能,我们改进了Ionic缓存视图元素和范围数据的能力。一旦控制器初始化,它可能会在应用程序的整个生命周期中持续存在;它只是隐藏起来并从手表循环中移除。因为我们没有重建作用域,所以我们添加了在再次进入观察周期时应该侦听的事件 要查看完整说明和$ionicView事件,请转到:
这可能就是您想要的: 默认情况下,爱奥尼亚会缓存您的视图和控制器(最多10个) 有一些事件可以让你的控制器根据这些事件做某些事情。有关示例,请参见此处:
默认情况下,您的控制器是缓存,这就是为什么您的控制器只触发一次。要关闭某个控制器的缓存,您必须修改
.config(..).state
并将cache
选项设置为false
。例如:
.state('myApp', {
cache: false,
url: "/form",
views: {
'menuContent': {
templateUrl: "templates/form.html",
controller: 'formCtrl'
}
}
})
如需进一步阅读,请访问跟进答案和链接,类似以下内容:
.controller('MyCtrl', function($scope) {
$scope.$on('$ionicView.enter', function() {
// Code you want executed every time view is opened
console.log('Opened!')
})
})
我在ionic上也遇到了类似的问题,在我选择camera选项卡时,我试图加载本机相机。我通过将控制器设置为照相机选项卡(在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方法在用户每次单击“相机”选项卡时加载本机相机。我没有必须更改角度缓存中的任何内容才能使其工作。我希望这会有所帮助。考虑到Ionic缓存上述视图元素和范围数据的能力,如果您希望在每次加载视图时运行控制器,这可能是另一种方法。您可以通过以下操作全局禁用ionic使用的缓存机制:
$ionicConfigProvider.views.maxCache(0)代码>
否则,我让它为我工作的方式就是
$scope.$on("$ionicView.afterLeave", function () {
$ionicHistory.clearCache();
});
这是为了在离开视图之前清除缓存,以便在每次再次输入时重新运行控制器。例如对@Michael Trouw
在你的控制器里放上这个代码。
这将在每次进入或激活此状态时运行,您无需担心禁用缓存,这是一种更好的方法
.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”禁用视图缓存
在您的视图中,将其添加到ion nav视图中,如下所示:
<ion-nav-view name="other" cache-view="false"></ion-nav-view>
任何一个都会使您的控制器始终被调用。尝试{{{doSomething()}}?问题不在于doSomething(),因为它启动得很好,只是不会触发两次。第一次打开视图时,它运行正常,第二次似乎只是加载缓存的视图或其他东西?ng init只调用该函数一次。您可以在部分视图中调用ng controller=“doSomething()”或{{doSomething()}},并且每当调用router/partial时就会触发函数。在配置状态下,将缓存设置为false。看看我的答案。谢谢,但这正是我正在做的。此代码仅在第一次打开视图时运行一次。我试着将一些东西登录到我的控制台,但它只在第一次触发。当你说它在你的应用程序中起作用时,你是在说一个ionic应用程序吗?我在试着看看是否这种情况对我不起作用。使用stateChange可以做到这一点,只需单击一个选项卡仍然只运行一次。谢谢你的编辑!我认为这与爱奥尼亚缓存应用程序某些部分的方式有关。也许将缓存视图设置为false会有所帮助?搜索缓存视图这可能是ionic最新版本的问题所在。但是,也可以在路由级别禁用缓存。只需在路由配置中的每个路由中添加一个cache:false。这对于注销控制器非常有用。不幸的是,在ionic中,缓存是默认打开的。似乎这应该是一个选择加入功能,而不是默认添加它。我只需要重新加载一个状态,所以我使用了:$state.go('app.statename',{},{reload:true})代码>(,)。虽然这样做有效,但这并不是正确的方法。这会让你的应用程序慢下来——假设你不想每次用户swi时都经历整个控制器初始化过程
<ion-nav-view name="other" cache-view="false"></ion-nav-view>
$stateProvider.state('other', {
cache: false,
url : '/other',
templateUrl : 'templates/other/other.html'
})