为什么$ scope.init()如果使用body标签则不会被调用?

时间:2015-03-24 00:49:47

标签: angularjs

我正在使用角度1.2.5。我有很多页面。有些页面使用以div标签开头的html模板,但其他页面使用以body标签开头的html模板。

我想在加载时调用一些函数来初始化页面。但是带有body标签的页面不会调用init方法。为什么?

<div class="row" data-ng-init="init()" ng-cloak>

行。

<body  data-ng-init="init()">

不行。

1 个答案:

答案 0 :(得分:1)

首先,必须在作用域上声明从View调用的任何类型的函数 - 这通常使用控制器完成:

.controller("MainCtrl", function($scope){
  $scope.init = function(){
  }
});

对于<body>,如果未在元素上定义ng-controller,则唯一可以定义它的地方是<html>标记 - 你有吗?

第二次,你真的不应该使用ng-init来初始化事物 - 这就是你可以使用控制器的东西。在上面的示例中,只需在控制器函数中初始化ViewModel - 无需单独使用$scope.init()调用ng-init

.controller("MainCtrl", function($scope){
  init();

  // init function here is only for organization purposes
  // it is not exposed on the scope - there is no need to 
  function init(){
    $scope.foo = "bar";
  }
});

那么,ng-init有什么用?

这是相当有限的 - 这是Angular docs对此所说的:

  

ngInit的唯一合适用途是对ngRepeat的特殊属性进行别名,如下面的演示所示。除了这种情况,您应该使用controllers而不是ngInit来初始化范围上的值。