Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 每当打开/显示视图时,运行控制器功能_Angularjs_Ionic Framework - Fatal编程技术网

Angularjs 每当打开/显示视图时,运行控制器功能

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

我正在用angular+ionic构建一个应用程序,它在底部使用一个经典的三按钮菜单,其中有三个离子标签。当用户单击选项卡时,该模板将通过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()函数可以很好地调用,但只有在用户第一次打开视图/选项卡时才调用。每当用户打开视图或选项卡时,我想调用一个函数(更新地理位置)

实现这一点的正确方法是什么


谢谢你的帮助

如果已将某个控制器分配给视图,则每次加载视图时都会调用控制器。在这种情况下,您可以在调用控制器后立即在控制器中执行某些代码,例如:

<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'
})