Ng-init通过函数

时间:2013-12-16 05:09:41

标签: angularjs angularjs-directive angularjs-ng-init

如您所知,可以按如下方式初始化对象:

<div ng-init="friends = [{name:'John', phone:'555-1276'},
                         {name:'Mary', phone:'800-BIG-MARY'},
                         {name:'Mike', phone:'555-4321'},
                         {name:'Adam', phone:'555-5678'},
                         {name:'Julie', phone:'555-8765'},
                         {name:'Juliette', phone:'555-5678'}]"></div>

是否可以通过函数定义类似的对象:

<div ng-init="init()">

我的目标实际上是从API获取对象并通过ng-repeat

在列表中显示它们

2 个答案:

答案 0 :(得分:21)

documentation表示ng-init将采取任何表达方式。所以,是的,只要关联的范围定义了一个名为init()的函数(我也验证了它的乐趣),你就可以做你想要的。

请注意,文档说ng-init实际上仅用于ng-repeat内的别名属性:

  

唯一适当使用ngInit来对别名的特殊属性进行别名处理   ngRepeat,如下面的演示中所示。除了这种情况,你应该使用   控制器而不是ngInit来初始化范围上的值。

最后,请注意,您可以在创建控制器时简单地初始化变量。所以根本不需要使用ng-init。例如:

var myApp = angular.module('myApp', []);

myApp.controller('myController', ['$scope', function($scope){

  $scope.init = function() {
    $scope.a = 'Apples';
    $scope.b = 'Bees';
    $scope.c = 'Zebras';
  };
  // runs once per controller instantiation
  $scope.init();

}]);

答案 1 :(得分:6)

  

因此,根本不需要使用ng-init

有时你会希望通过在视图中传递数据来初始化某些东西,这些数据可能在模板化页面中使用,例如.NET MVC,你想要将信息从.NET传递到角度(控制器已经拥有数据和最简单的方法是在ViewBag中传递它。

要做到这一点,&#34;正确&#34;方式是环形的,并且难以维护,因为你必须在页面上嵌入一个带有固定ID的脚本标签,并使用javascript / jquery将数据拉入控制器的范围,再次使用硬编码ID。

无论哪种方式打破(好吧,kludges)角度的MVW模式,所以,我想,选择你的毒药。