2014-02-16 3 views
0

Я не в состоянии ввести службу в директиву - она ​​работает с моим контроллером. Согласно документу, это должно быть довольно прямолинейно.AngularJS: Как внедрить сервис в директиву

Услуги:

priceGraphServices = angular.module('priceGraphServices', ['ngResource']) 

priceGraphServices.factory "myService", [ 
    "$resource" 
    ($resource) -> 
     return $resource("phones/priceDev.json", {}, 
      get: 
       method: "GET" 
       isArray: true 
     ) 
] 

Контроллер:

drawGraph.controller "MyCtrl", [ "myService", "$scope", (myService, $scope) -> 

    #Get RESTful data 
    myService.get {}, ((data) -> 

     # If success: Data is here 
     rawData = data 

     # Convert date and set draw options for graph 
     i = 0 
     while i < rawData.length 
      j = 0 
      while j < rawData[i].data.length 
       # Convert date 
       tmp = new Date(rawData[i].data[j][0]) 
       rawData[i].data[j][0] = tmp 

       # Set draw options 
       rawData[i].opts = 
       customBars: true, 
       labelsSeparateLines: "true", 
       hideOverlayOnMouseOut: false, 
       legend: "always", 
       showRangeSelector: true, 
       xAxisLabelWidth: 80, 
       ++j 
      ++i 

      $scope.graphs = rawData 

      return 
     ), (data) -> #failure 
      #error handling goes here 
] 

Я думаю, что код в контроллере, а должен быть в директиве, но мне не удается получить это право , Моя попытка:

Директива:

.directive "graph", [“myService”, (graph, myService) -> 
    restrict: "E" 
    scope: 
     data: "="  
     opts: "=?" 
     id: "=" 

    link: (scope, elem, attrs) -> 
     scope.graph = new Dygraph(elem.children()[0], scope.data, scope.opts) 

     myService.get {}, ((data) -> 
      # Controller Code 
] 

Но это не работает: нет ошибок в консоли, но пустой частично. Может ли кто-нибудь сказать мне, почему?

Update:

Моя текущая директива:

.directive "graph", ["myService", (myService) -> 
    restrict: "E" 
    scope: 
     data: "=" 
     opts: "=?" # '?' means optional 
     id: "=" 

    link: (scope, elem, attrs) -> 
     scope.graph = new Dygraph(elem.children()[0], scope.data, scope.opts) 

     # Get RESTful data 
     myService.get {}, ((data) -> 

      # If success: Data is here 
      rawData = data 

      # Convert date and set draw options for graph 
      i = 0 
      while i < rawData.length 
       j = 0 
       while j < rawData[i].data.length 
        # Convert date 
        tmp = new Date(rawData[i].data[j][0]) 
        rawData[i].data[j][0] = tmp 

        # Set draw options 
        rawData[i].opts = 
        customBars: true, 
        labelsSeparateLines: "true", 
        hideOverlayOnMouseOut: false, 
        legend: "always", 
        showRangeSelector: true, 
        xAxisLabelWidth: 80, 
        ++j 
       ++i 

       $scope.graphs = rawData 

       return 
      ), (data) -> #failure 


       #error handling goes here 

Update 2 (Составитель код):

App.js

var App; 
App = angular.module('app', ['test']); 

Directives.js

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

test.directive("graph", [ 
    "myService", function(myService) { 
    return { 
     restrict: "E", 
     scope: { 
     data: "=", 
     opts: "=?", 
     id: "=" 
     }, 
     link: function(scope, elem, attrs) { 
     scope.graph = new Dygraph(elem.children()[0], scope.data, scope.opts); 
     return myService.get({}, (function(data) { 
      var i, j, rawData, tmp; 
      rawData = data; 
      i = 0; 
      while (i < rawData.length) { 
      j = 0; 
      while (j < rawData[i].data.length) { 
       tmp = new Date(rawData[i].data[j][0]); 
       rawData[i].data[j][0] = tmp; 
       rawData[i].opts = { 
       customBars: true, 
       labelsSeparateLines: "true", 
       hideOverlayOnMouseOut: false, 
       legend: "always", 
       showRangeSelector: true, 
       xAxisLabelWidth: 80 
       }; 
       ++j; 
      } 
      ++i; 
      $scope.graphs = rawData; 
      return; 
      } 
     }), function(data) {}); 
     } 
    }; 
    } 
]); 
+0

'graph' параметр директивы Проводит ли ссылки на службу? Директивы принимают только свои зависимости в качестве аргументов, а 'graph' не зависит от вашей директивы. – frececroka

+0

Спасибо @frececroka, я обновил код в соответствии с вашим намеком (если я правильно понял, это то же самое, что и ответ Бабы ниже). К сожалению, он все еще не работает. – user3255061

+0

http://www.rubyinside.com/wp-content/uploads/2011/05/dhh12.png –

ответ

0

Должно быть:

.directive "graph", [“myService”, (myService) -> 
+0

Спасибо большое @baba, я обновил свой код выше с вашим предложением, к сожалению, я все еще не работаю.Я что-то неправильно понял? – user3255061

+0

лет, вы пробовали делать это в чистом js? Какие js он производит? –

+0

Я обновил свой код выше с помощью скомпилированных js. Мне кажется, что я не получаю правильную установку модулей, но не уверен (читайте учебник и документ снова, это выглядит правильно для меня). Большое спасибо за вашу помощь. – user3255061

0

Я установил код:

app = angular.module('app', []) 

app.directive "graph", ["myService", (myService) -> 
    restrict: "E" 
    scope: 
     data: "=" 
     opts: "=?" # '?' means optional 
     id: "=" 

    link: (scope, elem, attrs) -> 
     scope.graph = new Dygraph(elem.children()[0], scope.data, scope.opts) 

     # Get RESTful data 
     myService.get {}, ((data) -> 

      # If success: Data is here 
      rawData = data 

      # Convert date and set draw options for graph 
      i = 0 
      while i < rawData.length 
       j = 0 
       while j < rawData[i].data.length 
        # Convert date 
        tmp = new Date(rawData[i].data[j][0]) 
        rawData[i].data[j][0] = tmp 

        # Set draw options 
        rawData[i].opts = 
         customBars: true 
         labelsSeparateLines: "true" 
         hideOverlayOnMouseOut: false 
         legend: "always" 
         showRangeSelector: true 
         xAxisLabelWidth: 80 
        ++j 
       ++i 

      $scope.graphs = rawData 
      return 

      ), (data) -> #failure 

       #error handling goes here 
] 

Попробуйте этот плагин: https://sublime.wbond.net/packages/JavaScript%20%26%20Coffeescript%20Build%20Systems

+0

Большое спасибо @Ilan Frumer за усилия и ссылку на плагин. Я боюсь, что инициализация модуля для директивы неверна, потому что она по-прежнему не работает. Это просто «angular.module» приложение, [] »над директивой, не так ли? Или я чего-то не хватает? – user3255061

+0

@ user3255061 Я не вижу, как ваши модули подключены. –

+0

Я снова прочитал учебник по модулям (http://docs.angularjs.org/tutorial/step_07) - я связал их неправильно? Я обновил код выше. Большое спасибо за вашу помощь, я очень ценю это. – user3255061

Смежные вопросы