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 ответов


на документация говорит 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();

}]);

Так что действительно нет необходимости использовать ng-init вообще

иногда вы хотите инициализировать что-то, передавая данные в представлении, которые могут использоваться на шаблонной странице, такой как .NET MVC, где вы хотите передать информацию из .NET в angular (контроллер уже имеет данные, и самый простой способ-передать это в ViewBag).

для этого "правильный" способ является окольным и трудно поддерживать, так как вам нужно вставить тег скрипта с фиксированным идентификатором на странице и используйте javascript / jquery, чтобы вытащить данные в область вашего контроллера, снова используя жестко закодированный идентификатор.

в любом случае ломает (ну, kludges) mvw-шаблон углового, поэтому, я думаю, выберите свой яд.