2017-01-26 1 views
1

So habe ich eine Reihe von Fabriken, die ziemlich ähnlich aussehen. Ich möchte vielleicht eine generische Funktion machen, die doppelten Code reduziert.Generische Fabrik/Service zu vermeiden doppelten Code in Angular

Beispiel Code:

.factory('neQueryService', function ($http, $resource, constants) { 
return $resource(constants.GEODATA_QUERY, {}, 
    { 
    get: { 
     method: 'GET', 
     transformResponse: function(data, headers, status){ 
     var response = {}; 
     response.data = data; 
     response.headers = headers(); 
     response.status = status; 
     return response; 
     } 
    } 
    } 
); 

Und

.factory('neTaskService', function ($http, $resource, constants) { 
return $resource(constants.GEODATA_TASK, {}, 
    { 
    get: { 
     method: 'GET', 
     transformResponse: function(data, headers, status){ 
     var response = {}; 
     response.data = data; 
     response.headers = headers(); 
     response.status = status; 
     return response; 
     } 
    } 
    } 
); 

Wie Sie sehen können, alles von der "get" bis zu "Rückkehr" i unter den Fabriken identisch. Gibt es eine intelligente "Best-Practice" -Methode, diesen Teil vielleicht in eine separate Funktion zu überführen und sich darauf in allen Fabriken zu beziehen?

Antwort

3

Sie einen value() Anbieter für diese verwenden könnte, da es keine externen Abhängigkeiten hat:

.value('resourceConfig', { 
    get: { 
     method: 'GET', 
     transformResponse: function(data, headers, status){ 
     var response = {}; 
     response.data = data; 
     response.headers = headers(); 
     response.status = status; 
     return response; 
     } 
    } 
}); 

.factory('neQueryService', function ($http, $resource, constants, resourceConfig) { 
    return $resource(constants.GEODATA_QUERY, {}, resourceConfig); 
}); 

.factory('neTaskService', function ($http, $resource, constants, resourceConfig) { 
    return $resource(constants.GEODATA_TASK, {}, resourceConfig); 
}); 

Oder Sie könnten einen Schritt weiter gehen und eine Fabrik ausklammern für Ihre Ressourcen zu schaffen:

.factory('prepareResource', function ($resource) { 
    return function (query) { 
     return $resource(query, {}, { 
      get: { 
       method: 'GET', 
       transformResponse: function(data, headers, status){ 
        var response = {}; 
        response.data = data; 
        response.headers = headers(); 
        response.status = status; 
        return response; 
       } 
      } 
     }); 
    }; 
}); 

.factory('neQueryService', function (prepareResource, constants) { 
    return prepareResource(constants.GEODATA_QUERY); 
}); 

.factory('neTaskService', function (prepareResource, constants) { 
    return prepareResource(constants.GEODATA_TASK); 
}); 
+0

Ausgezeichnete Vorschläge sehen. Ich habe den letzten benutzt. Aber fragen Sie sich immer noch, wie man weiß, welcher "Best Practice" -Stil ist? Irgendwelche Worte dazu? – Amir

+0

@Amir Ich denke, das ist eher eine Frage der Präferenz als alles andere. Ich würde die zweite bevorzugen, da sie die größte Menge an Code herausrechnet, aber wenn Sie zum Beispiel nicht immer Ressourcen auf diese Weise erstellen wollten und manchmal '$ resource (constants.GEODATA_QUERY, somethingSpecificToThisResource, resourceConfig) aufrufen wollten. ', dann wäre die erste Option besser. – JLRishe

+0

Danke, ich verstehe deinen Standpunkt. – Amir

1

Wenn Sie nicht ES6 Module werden, bewegen sich nur gemeinsam Code in ein anderes Werk:

.factory('GetQuery', function() { 
    return { 
    method: 'GET', 
    transformResponse: function(data, headers, status){ 
     var response = {}; 
     response.data = data; 
     response.headers = headers(); 
     response.status = status; 
     return response; 
    } 
    }); 

.factory('neQueryService', function ($http, $resource, constants, GetQuery) { 
    return $resource(constants.GEODATA_QUERY, {}, 
    { 
     get: GetQuery 
    } 
); 
1

Alternativ konfigurieren Sie die Standardaktion in $ resourceProvider:

app.config(function($resourceProvider) { 
    $resourceProvider.defaults.get = { 
     method: 'GET', 
     transformResponse: function(data, headers, status){ 
      var response = {}; 
      response.data = data; 
      response.headers = headers(); 
      response.status = status; 
      return response; 
     } 
    }; 
}); 

Weitere Informationen AngularJS $resourceProvider API Reference.

Verwandte Themen