12

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

<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 在列表中显示它们

4

2 回答 2

21

文档说将ng-init采取任何表达方式。所以是的,只要关联的范围定义了一个名为的函数init()(我也验证了它是为了好玩),你就可以在上面做你想做的事情。

请注意,文档中说这ng-init实际上仅用于在 a 内对属性进行别名处理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();

}]);
于 2013-12-16T05:44:23.157 回答
6

所以根本没有必要使用 ng-init

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

要做到这一点,“正确”的方式是迂回的,并且难以维护,因为您必须在页面上嵌入具有固定 ID 的脚本标签并使用 javascript/jquery 将数据拉入控制器中的范围,再次使用硬-编码的ID。

无论哪种方式都会破坏(嗯,kludges)角度的 MVW 模式,所以,我想,选择你的毒药。

于 2014-08-07T09:40:49.597 回答