2015-06-12 3 views
0

Я пытаюсь получить доступ к вложенной функции внутри фабрики, которую я ввел в контроллер в AngularJS, но просто получаю сообщение об ошибке «function is undefined». Я думаю, что контроллер не может даже получить доступ к внутренней функции. Зачем? Является ли это даже законным JavaScript?Доступ к закрытым функциям закрытия в угловой фабрике

Служба

(function() { 
    'use strict'; 

    angular 
     .module('myModule', []) 
     .factory('myFactory', myFactory); 

    function myFactory() { 
     var outerVar = 0; 

     function foobar() { 
      var innerVar; 

      function foo() { 
       innerVar = outerVar++; 
       console.log(innerVar); 
      } 

      function bar() { 
       innerVar = outerVar--; 
       console.log(innerVar); 
      } 

      return { 
       foo: foo, 
       bar: bar 
      } 
     } 

     return { 
      foobar: foobar 
     } 
    } 
}()); 

Контроллер

(function() { 
    'use strict'; 

    angular 
     .module('myModule') 
     .controller('myController', myController); 

    function myController(myFactory) { 

     myFactory.foobar.foo(); 
    } 
}()); 

ответ

1

Вы должны вызвать функцию Foobar, то он возвращает нужный объект

(function() { 
'use strict'; 

angular 
    .module('myModule') 
    .controller('myController', myController); 

    function myController(myFactory) { 

     myFactory.foobar().foo(); 
    } 
}()); 
+0

было бы лучше использовать '' обслуживания здесь вместо 'factory'? Возможно, было бы более элегантным ... – uloco

+1

см., Что разница между использованием услуги и фабрикой заключается в том, что если вы используете завод, и когда вы вводите эту фабрику, угловой вызовет заводскую функцию и вернет вам результат, т.е. * * foobar ** объект в этом случае. Однако, если вы используете службу, и вы ее вводите, где вам будет предоставлен новый экземпляр функции i.e ** new myFactory() **. –

+0

Итак, закрытие не будет работать, потому что я получаю новый экземпляр? – uloco

1

Просто попробуйте:

myFactory.foobar().foo(); 
myFactory.foobar().bar(); 

Это так, как это предполагается использовать.