2016-10-26 3 views
0

Während die Frage mehr ich javascript Typ Frage annehmen ist mehr als eine Angular Frage, ich war in dem einen Service ich es wie diesesAngular-Service erstellt Funktion muss dieses Schlüsselwort

// controller injects activityApi , then service function call is made 
var activities = activityApi.getActivityById(1122); 

nennen würde ich eine bekommen Fehler, wenn ich "dieses" Schlüsselwort nicht vor Funktionsname setze 1. Warum brauche ich "dies".
2. Welche anderen Alternativen? (Ich versuche, in die Gewohnheit, nicht der alten Schule Javascript tun mit function blah() { ... }

this.getActivityById = function(id) { 
     $http.get('/Umbraco/Api/ActivityApi/GetActivity'). 
      success(function (data, status, headers, config) { 
      console.log(data); 
      return data; 
      }). 
     error(function (data, status, headers, config) { 
      // log error 
     }); 
    }; 
+0

'this' ist sicherlich ein impo rtant kritisches Konzept in Javascript. In Bezug auf Angular haben Sie vielleicht eine Fabrik gesehen. Eine Fabrik braucht dieses nicht, aber der Service braucht sie. Service ist eine Konstruktorfunktion und Fabrik ist nicht. Unter der Haube Object.create() wird mit Service aufgerufen, factory ist nur eine Funktion, die aufgerufen wird und warum sie explizit zurückgegeben wird. –

Antwort

1

Wenn Sie ein Werk schreiben Verwendung eines Objekts in der Fabrik machen, und setzen alle Ihre Anrufe in it.like

(function() { 
    'use strict'; 

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

    activityApi.$inject = ['$http']; 

    function activityApi($http) { 
     var service = { 
       getActivityById : getActivityById , 
     }; 
     return service; 


    function getActivityById (id) { 
     $http.get('/Umbraco/Api/ActivityApi/GetActivity'). 
      success(function (data, status, headers, config) { 
      console.log(data); 
      return data; 
     }). 
     error(function (data, status, headers, config) { 
      // log error 
     }); 
    }; 

    }; 
})(); 

hier Sie zurückgeben Factory-Objekt, in dem Aufruf-Funktion zur Verfügung.

hier können Sie die Fabrik Funktion als

nennen
var activities = activityApi.getActivityById(1122); 
+0

Ich lese über beide Fabriken und Dienstleistungen, während ich "könnte" stattdessen auf eine Fabrik wechseln, frage ich mich über die 'angular.module ('app'). Fabrik ..'Syntax ist das" besser "oder bevorzugte über meine, in dem ich' app.service ("activityApi", Funktion ($ http) {...}); '? –

+0

@ JeremyMiller, siehe [meine Antwort] (http://stackoverflow.com/a/40254350/2545680) –

+0

Ich würde 'angular.module ('app') .Fabrik..' bevorzugen, weil es nicht gut ist Vorgehensweise, um die gesamte Anwendung einer einzelnen Variablen-App zuzuweisen und global zu verwenden. –

0

In Bezug auf Winkel Services und Fabriken. Sowohl .service als auch .factory Rücksprungfunktionen. Winkel ruft jedoch die Funktion .service mit new Schlüsselwort (mit $instantiate Methode), während es ruft .factory Funktion wie invoke Methode. Da das Schlüsselwort new für Servicefunktionen verwendet wird, muss das Schlüsselwort this in der Funktion enthalten sein, um auf das von new erstellte und von der Funktion zurückgegebene Objekt zu verweisen.

Wie @NikhilVM zeigt, können Sie factory anstelle von service verwenden, wenn Sie dies vermeiden möchten. Sowohl der Service als auch factory Rückgabewerte werden zwischengespeichert. Wenn die Factory also ein Objekt zurückgibt, wird es global. In diesem Sinne unterscheidet es sich nicht von service mit this, um Methoden hinzuzufügen. Die Verwendung von factory hat den Vorteil, dass Sie einen Funktionskonstruktor zurückgeben können, der später aufgerufen wird, um mehrere Klasseninstanzen zu instanziieren, während Sie dies nicht mit .service ausführen können.

0

Wenn Sie für die Zukunft ausgerichtet werden möchten, sollten Sie Services über Fabriken verwenden.

Is there any advantage over the other at all then? Yes, there is. It turns out that it’s actually better to use services where possible, when it comes to migrating to ES6. The reason for that is simply that a service is a constructor function and a factory is not. Working with constructor functions in ES5 allows us to easily use ES6 classes when we migrate to ES6.

Referenz - einige Angular guru Meister, der Teil von Angular 2 Autorenteam in irgendeiner Weise (die Website sagt) Dies ist eine gute lesen http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html

  1. Verwenden Sie Ihren Service mit this oder
  2. Verwenden Sie Fabrik wie das OP vorgeschlagen
+0

Ok, schön, ich muss mehr darüber lesen und verstehe 'this' besser –

Verwandte Themen