web-dev-qa-db-fra.com

Ng-init via la fonction

Comme vous le savez, il est possible d'initialiser des objets comme suit:

<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>

Est-il possible de définir un objet similaire comme celui-ci mais via une fonction:

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

Mon objectif est en fait de prendre les objets d'une API et de les afficher dans une liste via ng-repeat

12
Asqan

Le documentation indique que ng-init Prendra n'importe quelle expression. Donc oui, vous pouvez faire ce que vous voulez ci-dessus tant que la portée associée définit une fonction appelée init() (et je l'ai également vérifiée pour le plaisir).

Notez que la documentation indique que ng-init Est vraiment destiné uniquement à être utilisé pour les propriétés d'alias à l'intérieur d'un ng-repeat:

La seule utilisation appropriée de ngInit pour aliaser les propriétés spéciales de ngRepeat, comme indiqué dans la démo ci-dessous. Outre ce cas, vous devez utiliser des contrôleurs plutôt que ngInit pour initialiser des valeurs sur une étendue.

Enfin, notez que vous pouvez simplement initialiser vos variables lors de la création du contrôleur. Il n'est donc vraiment pas nécessaire d'utiliser ng-init. Par exemple:

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();

}]);
21
Sunil D.

Il n'y a donc pas du tout besoin d'utiliser ng-init

Parfois, vous voudrez initialiser quelque chose en passant des données dans la vue, qui pourraient avoir leurs utilisations dans une page de modèle telle que .NET MVC, où vous souhaitez passer des informations de .NET à angular ( contrôleur a déjà les données et le moyen le plus simple est de les transmettre dans un ViewBag).

Pour ce faire, la manière "correcte" est détournée et difficile à maintenir car vous devez intégrer une balise de script avec un ID fixe sur la page et utiliser javascript/jquery pour extraire les données dans votre portée dans votre contrôleur, en utilisant à nouveau le disque -ID codé.

Dans les deux cas, ça casse (enfin, kludges) le modèle MVW angulaire, alors, je suppose, choisissez votre poison.

6
EnderWiggin