0

Voici à quoi ressemble mon application angulaire.Quand devrais-je créer une usine ou une machine virtuelle en mode angulaire?

(function() { 
"use strict"; 

angular 
    .module("app") 
    .controller("custCtrl", custCtrl); 

custCtrl.$inject = ['dataService','custFactory']; 

/* @ngInject */ 
function custCtrl(dataService, custFactory) { 
    var vm = this; 
    //line## 
    vm.customer= custFactory.Create('customer'); 

    GetCustomers(); 
    function GetCustomers() { 

     dataService.read().then(function (data) { 
       vm.customer = data.fields; 
      } 
     }); 

    } 

    return vm; 
} 
})(); 

Méthode usine

(function() { 
'use strict'; 

angular 
    .module('app.factory') 
    .factory('custFactory', custFactory); 

custFactory.$inject = ['$q']; 

/* @ngInject */ 
function custFactory($q) { 
    var _create = function (type) { 

     var obj = {}; 

     switch (type.toString().toLowerCase()) { 
      case "customer": 
       obj = new Customer(); 
       break; 
      default: 
       obj = null; 
     } 

     return obj; 
    } 

    return { 
     Create: _create 
    }; 
} 
})(); 

Voir modèle

function Customer() 
{ 

var dto = this; 

dto.Customer = { 
    "Name" : "", 
    "Gender" : "", // & so on 
} 

return dto; 
} 

Si vous cochez mon custCtrl ci-dessus sur // ligne ##, je fais appel méthode usine instancier objet client comme ci-dessous .

vm.customer= custFactory.Create('customer'); 

Mais si je ne suis pas créer un client usine VM & et assign simple, une chaîne vide comme ci-dessous.

 vm.customer= {}; 

Toujours son fonctionnement sans problème.

Donc ma question pourquoi devrais-je créer un VM & usine ?? Quel est son avantage ?

+0

Vous utilisez 'var vm = this;' juste pour représenter la portée de liaison et supprimer l'injection de '$ scope' dans votre contrôleur. En général, vous décorez 'vm' avec les propriétés qui doivent être liées à la vue. Je ne comprends pas pourquoi avez-vous besoin du code sur la ligne '// ligne ##' si vous remplacez ensuite le 'vm.customer' par' data.fields' dans la méthode 'GetCustomers()'. –

Répondre

1

l'alias du contrôleur est adapté lorsque vous avez des contrôleurs imbriqués,

tandis que l'usine ou les services sont adaptés pour partager des données entre les différents contrôleurs.

Par exemple, il est utile d'avoir votre mehtod CreateCustomer si vous l'utilisez depuis différents contrôleurs. Comme vous ne stockez pas de données, il est préférable d'utiliser un service à la place. Quoi qu'il en soit, cela vous permet d'enregistrer du code.

EXEMPLE

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

app.factory("myFactory", function(){ 
    var private = { 
     users: {} 
    }; 
    var data = { 
     getUser: function(id){ 
      return private.users[id]; 
     }, 
     createUser: function(id){ 
      private.users[id] = someData; 
      return private.currentUser; 
     } 
    }; 

    return data; 
}); 


app.controller("myC1", ["myFactory", function(myFactory){ 

    $scope.user = myFactory.createUser(1); 

}]); 


app.controller("myC2", ["myFactory", function(myFactory){ 

    $scope.user = myFactory.getUser(1); 

}]); 

Comme vous le voyez les deux contrôleurs peuvent accéder aux mêmes données

1

modèles de AngularJS et les meilleures pratiques impliquent la suite de la MV (quel que soit) modèle et la conception/mise en œuvre de composants modulaires à haute cohésion et faible couplage. De cette façon, vous pouvez facilement modifier un morceau de code sans avoir à apporter de modifications dans un autre morceau de code.

Généralement, une fabrique ou un service est utilisé comme couche de code côté client qui interagit avec une API RESTful ou un type de code côté serveur. Typiquement, c'est la seule fonction de l'usine. De cette façon, vous pouvez injecter l'usine dans n'importe quel contrôleur qui doit utiliser les fonctions de l'usine. Lorsque vous avez besoin de modifier la façon dont vous appelez votre API, il suffit de faire une modification en usine au lieu de chaque contrôleur qui utiliserait cette fonction.

De même, avec l'objet de modèle de vue que vous avez créé, vous devez uniquement effectuer des modifications à un endroit. Imaginez que vous ayez cinq contrôleurs différents qui doivent tous utiliser un objet Customer. Vous décidez maintenant de supprimer le champ Name et de le remplacer par FirstName et LastName. Souhaitez-vous passer en revue tous vos contrôleurs et faire ce changement, ou voulez-vous juste changer le modèle de vue?

Pour vous donner la réponse courte. Il n'y a rien fonctionnellement mal de ne pas créer un modèle de vue ou une usine/service. Du point de vue de l'architecture ou de la conception, il est logique d'avoir une forte séparation des préoccupations dans votre application. Par conséquent, il est logique d'utiliser une fabrique pour l'accès aux données et un modèle de vue pour vos objets de données. Essayez d'imaginer votre application en pleine croissance pour avoir des centaines de contrôleurs/vues et des dizaines d'usines ou de services. Ce serait une énorme douleur de maintenir cette application si vous n'aviez pas ces modèles et les meilleures pratiques mises en œuvre dès le début du développement.

+0

Merci! la chose qui me déroute est pourquoi ai-je besoin de // ligne ## si alors écraser le vm.customer avec data.fields dans la méthode GetCustomers() –