Angular:ng-init不会在加载时运行

Ant*_*hes 12 controller angularjs angularjs-ng-init

我已经看到关于这个ng-init问题的堆栈溢出的一些exmaples,虽然我似乎找不到使用控制器引用它的一个.

我通过在html文件中包含以下内容来调用控制器中的函数

<div class="tab-container" ng-controller = "ExampleController" ng-init = "init()" >
Run Code Online (Sandbox Code Playgroud)

在控制器中:

$scope.init = function(){

        alert("do something");
};
Run Code Online (Sandbox Code Playgroud)

它确实运行,但它在组件加载到屏幕上之前运行.

我错过了什么吗?

谢谢

dom*_*kun 15

ng-init 应该像这样工作,因为它用于初始化数据.

一个非常简单的例子:

<ul ng-init="list = [1,2,3,4]">
  <li ng-repeat="l in list"></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

如果你在控制器加载时尝试运行某些东西,它实际上比你想象的要简单得多:

app.controller('mainCtrl', function ($scope) {

  var init = function ($scope) {
    // do whatever you need to do to initialize your controller
    $scope.someData = ["Hey", "I'm", "Alive"]
    $scope.otherData = localStorage.getItem('myBackup')
  }

  init()

})
Run Code Online (Sandbox Code Playgroud)

或者甚至更简单,如果你不需要这个功能(没有封闭或其他)

app.controller('mainCtrl', function ($scope) {

  // do whatever you need to do to initialize your controller
  $scope.someData = ["Hey", "I'm", "Alive"]
  $scope.otherData = localStorage.getItem('myBackup')

})
Run Code Online (Sandbox Code Playgroud)

编辑 - 假设您正在使用ngView:
要在页面完全加载时运行代码,您应该在事件上设置观察者$viewContentLoaded,如下所示:

  $scope.$on('$viewContentLoaded', function(){
    //Here your view content is fully loaded !!
  });

app.controller('mainCtrl', function ($scope) {

  // This event is triggered when the view has finished loading
  $scope.$on('$viewContentLoaded', function() {

    $scope.someData = ["Hey", "I'm", "Alive"]
    $scope.otherData = localStorage.getItem('myBackup')      

  })    
})
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,以这种方式使用ng-init可以将服务器端变量传输到初始index.html,例如ng-init ="init(@razorVariable)",显然有其他选择,但我发现这种方法实际上很干净.我们在将现有应用程序转换为SPA应用程序时使用了相当多的功能.在那里完成的事情可能不会以这种方式初始化那么多东西,但是人们永远无法真正排除这一点. (2认同)