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

Ответ 1

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

}]);

Ответ 2

Поэтому нет необходимости вообще использовать ng-init

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

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

В любом случае ломается (ну, kludges) MVW-шаблон angular, поэтому, я думаю, заберите свой яд.