2013-11-02 12 views
11

ich folgende Controller haben:wie übergebe ich scope von controller an service in angularjs?

'use strict'; 

    /* Controllers */ 

    angular.module('stocks.controllers', []). 
    controller('MyCtrl1', ['$scope', '$http', 'stockData', function MyCtrl1 ($scope, $http, stockData) { 

     $scope.submit = function() { 




     $scope.info = stockData.query(); 
     console.dir($scope.info); 
     } 

    }]); 

und ich möchte ein gebundenes ng-Modell zu übergeben, ...

'use strict'; 

    /* Services */ 

    angular.module('stocks.services', ['ngResource']).factory('stockData', ['$resource', 
     function($resource){ 
     return $resource('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json', {}, { 
     query: {method:'GET', isArray:false} 
     }); 
    }]); 

genannt ng-model="symbol_wanted" dem folgenden Dienst in meiner Sicht sitzt wie verbinde ich der Umfang des Controllers, um in den Service aufgenommen zu werden? Vielen Dank!

+0

wann? Haben Sie eine Funktion definiert, die bei einem 'ng-Klick' aufgerufen wird? –

+0

Die Frage ist seltsam, da es davon ausgeht, dass Sie nicht einfach tun können: 'myService ($ scope)'. Der Rest der Kommentare und Antworten zeigt verschiedene 'angularjs' Muster, anstatt zu antworten, was im Titel gefragt wird. –

Antwort

13

Sie können $ scope nicht in Dienste injizieren.

i want to pass a bound ng-model that sits in my view called ng-model="symbol_wanted" to the following service...

Sie können den Dienst aufrufen und Parameter auf diese Weise passieren:

.factory('stockData', ['$resource', '$q', function ($resource, $q) { 

    var factory = { 
     query: function (value) { 

      // here you can play with 'value' 

      var data = $resource('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json', {}, { 
       query: { 
        method: 'GET', 
        isArray: false 
       } 
      }); 
      var deferred = $q.defer(); 
      deferred.resolve(data); 
      return deferred.promise; 
     } 

    } 
    return factory; 
}]); 

So diesen Service, den wir anrufen und ein Versprechen zurück wie diese:

stockData.query(value) // <-- pass value 
     .then(function (result) { 
     $scope.data = result;    
    }, function (result) { 
     alert("Error: No data returned"); 
    }); 

BTW, würde ich schlagen vor, dass Sie $http.get verwenden:

Demo Fiddle

+0

Ich habe das getan und ich bekomme Fehler: $ Scope ist nicht definiert. Wie greife ich auf $ scope.symbol_wanted im Controller zu? –

+0

in Controller oder Service? In Ihrem Beispiel ist $ scope definiert. –

+0

Ich habe Ihren Code implementiert, und es werden keine Fehler in der Konsolen-Registerkarte angezeigt oder angezeigt, aber ich sehe keine Daten vom Ajax-Aufruf zurück. –

4

Ihr ng-model Wert wird automatisch zu einer Bereichseigenschaft. So können Sie nur in Ihrem Controller verwenden, um dies den aktuellen Wert zu erhalten:

$scope.symbol_wanted; 

So lassen Sie uns sagen, dass Sie eine Funktion haben, den Klick in Ihrem Controller zu handhaben:

$scope.handleMyClick = function() { 

    stockData.query($scope.symbol_wanted); 
} 

Sie können nur Verwenden Sie die Bereichseigenschaft.

+0

Ich habe dies getan und ich bekomme Fehler: $ Scope ist nicht definiert. Wie greife ich auf $ scope.symbol_wanted im Controller zu? –

+0

In Ihrem obigen Beispiel verwenden Sie bereits '$ scope' in Ihrem Controller. Mein Beispiel soll auch in den Controller gehen. –

+0

Sie müssen auch Ihr HTML-Markup hinzufügen, damit wir sehen können, wie 'ng-Modell' definiert ist. –

Verwandte Themen