6

ich Mühe, mich auf, herauszufinden, wie Parameter zu übergeben von meinem angularcontroller zu serviceAngularJS: passing params von Controller-Service

#my controller 
'use strict'; 

angular.module('recipeapp') 
    .controller('recipeCtrl', ['$scope', 'recipeService', 
    function($scope, recipeService){ 
     $scope.recipeFormData={}; 
     $scope.recipeSave = function(){ 
     recipeService.saveRecipe(); 
     } 


    }]); 

#my service 
'use strict'; 
angular.module('recipeapp').service('recipeService',['$http', function($http){ 

    this.saveRecipe = save; 

    function save(callback){ 
    //calling external http api 
    } 

}]); 

Was ich versuche, hier zu tun ist, bekommen die $scope.formData von meiner Form und Steuerung, das zu service, per meinem Verständnis passieren sollen, kann ich $scope nicht im service verwenden, so muß ich die Weitergabe $scope.formData an den Service, einen Weg finden

harte Idee wäre, in der Steuerung, recipeService.saveRecipe($scope.formData); aber ich bin nicht sicher, wie das aus dem Dienst zu sammeln,

wenn ich den Dienst geändert this.saveRecipe(val) = save; es funktioniert nicht :(

jede Hilfe appriciated würde

+0

Speichern ist undefiniert, wenn es saveRecipe zugeordnet ist. Fügen Sie die Zuweisung nach der Speicherfunktion ein.Normalerweise müssen Sie formData nicht manuell erstellen. Normalerweise würde man an ein Modell binden und dann das Modell an saveRecipe übergeben. – pixelbits

+0

Übergeben Sie Ihre Variable als Parameter – Satpal

+0

@pixelbits, danke für die Antwort .. Ich habe ein Modell, das die Werte aus dem Formular bindet. Was ich nicht herausfinden kann ist, wie man das Modell an die 'saveRecipe' Funktion im Service weiterleitet? – sameera207

Antwort

16

Dieses Beispiel zeigt die richtige Struktur eines Winkel App:

  • Modell Initialisierung in Ihrem Controller
  • Implementierung eines Service Singleton und Injektion in Ihren Controller
  • Verwendung von $ http verspricht, Web-API-Aufrufe asynchron aufzurufen und Anrufer Ihres Dienstes zu ermöglichen, ihren Erfolg/Misserfolg zu behandeln.
  • Verwendung der Syntax "controller as", um Funktionen von Ihrem Controller aus zu exponieren, anstatt Funktionen direkt aus dem Oszilloskop zu exponieren.
  • Zweiweg-Datenmodell Bindung (Textbox-to-Rezept und Rezept-to-Textbox)

Modell innerhalb des Controllers Initialisiere:

angular.module('recipeapp') 
    .controller('recipeCtrl', ['$scope', 'recipeService', 
    function($scope, recipeService){ 
     // initialize your model in you controller 
     $scope.recipe={}; 

     // declare a controller function that delegates to your service to save the recipe 
     this.saveRecipe = function(recipe) { 
      // call the service, handle success/failure from within your controller 
      recipeService.saveRecipe(recipe).success(function() { 
       alert('saved successfully!!!'); 
      }).error(function(){ 
       alert('something went wrong!!!'); 
      }); 

     } 
    }]); 

in Ihrem Rezept Service, definieren die saveRecipe Funktion:

angular.module('recipeapp').service('recipeService',['$http', function($http){ 

    // expose a saveRecipe function from your service 
    // that takes a recipe object 
    this.saveRecipe = function(recipe){ 
     // return a Promise object so that the caller can handle success/failure 
     return $http({ method: 'POST', url: '/api/recipe/add', data: recipe}); 
    } 

}]); 

Binden Sie Ihr Rezeptobjekt an Ihre Ansicht; fügen Sie eine Taste, um die saveRecipe Controller-Funktion aufrufen und das Rezept (vorbei in das Modell Rezeptobjekt) speichern:

<div ng-app="recipeapp" ng-controller="recipeCtrl as ctrl"> 
    <form name="recipeForm"> 
    Recipe Name: <input type="text" ng-model="recipe.name" /> 
    <button ng-click="ctrl.saveRecipe(recipe)">Save Recipe</button> 
    </form> 
</div> 
+0

funktioniert perfekt, vielen Dank: D, ziemlich neu zu "eckig" und noch lernen :) – sameera207

1
var module = angular.module('example.service', []); 


module.services('ExampleServices', ['$http', '$q', function ($http, 
$q) { 

    var resourceUrl; 

    return { 


     setResourceUrl: function(resourceUrl) { 
      this.resourceUrl = resourceUrl; 
     }, 



     create: function(params) { 
      //access params here sent from controller 
      //make call to server using $http 
      //return back the promise or response 
     }, 



     remove: function(id) { 
      //access id here sent from controller 
      //make call to server using $http 
      //return back the promise or response 
     } 

} 

Später in Ihrem Controller die Service ExampleServices

Und dann Zugang zu injizieren:

ExampleServices.create(params) 

Parameter können ein beliebiges Objekt sein, höchstwahrscheinlich Daten, die mithilfe von Formularen erfasst wurden.

ExampleServices.remove(id) 

ID könnte die primäre ID des Datensatzes sein, der aus der Datenbank entfernt werden soll.

Hoffe, dass hilft :)

+0

Danke für die Formatierung @Tetiana Chupryna –

+0

Mein Vergnügen @Coder John –