2015-08-26 2 views
4

Я прохожу через это blog.Как работает внутренняя фабрика в AngularJS?

enter image description here

Автор выдвигает,

Когда вы используете Factory вы создаете объект, добавлять свойства к нему, то возвращение в тот же объект. Когда вы передадите эту услугу в свой контроллер, те свойства на объекте теперь будет доступен в этом контроллере через вашу фабрику.

Так, согласно моему пониманию, этой линии

enter image description here

заменяется на

enter image description hereenter image description hereenter image description here

в службы, то объект будучи вернулся, когда мы вызываем myFactory().

не выдает Шифрование до этой точки,

Теперь рассмотрим фрагмент кода,

<script type="text/javascript"> 
    var module = angular.module('MyApp', []); 

    module.factory('VaderService', function() { 
     var VaderClass = function(padawan) { 
      this.name = padawan; 
      this.speak = function() { 
       return 'Join the dark side ' + this.name; 
      } 
     } 
     return VaderClass; 
    }); 

    module.controller('StarWarsController', function($scope, VaderService) { 
     var luke = new VaderService('luke'); 
     $scope.luke = luke.speak(); 
    }); 
</script> 
</head> 
<body ng-app="MyApp"> 
    <table ng-controller="StarWarsController"> 
     <tbody> 
     <tr><td>{{luke}}</td></tr> 
     </tbody> 
    </table> 
</body> 

печатает как,

Join the dark side luke 

я не в состоянии понять, что происходит здесь, с этой линией

var luke = new VaderService('luke'); 

Мы создали экземпляр завода VaderService ('Лука') передавая строку luke в качестве параметра, но удивительно, что аргументы не определены в

module.factory('VaderService', function() {... 

Во-вторых, функция возвращается, т.е. VaderClass(), а не objec t. (Я очень хорошо знаю, что функции в javascript являются первоклассными объектами).

Как строка luke получает передается аргумент в VaderClass функции?

+1

Но вы возвращаете эту «var VaderClass = function (padawan)», и это то, что применяется. Внешняя функция используется как корпус. – dmitry

ответ

2

Линии не заменяются, как вы указали. В принципе, как только вы вводите завод, код внутри него запускается один раз. Затем Угловая функция выполняет функцию VaderService один раз с новым. Результат (так возвращаются внутри фабрики) - это объект, который будет передаваться в каждое место, где вы вводите завод.

Обратите внимание на то, что Угловая терминология в этой области немного контрастно интуитивно понятна по сравнению с объектно-ориентированными языками. В Java фабрика используется для создания объектов определенного типа. В Angular эта фабрика используется для создания единого объекта, который совместно используется модулем. Это больше похоже на Singleton в традиционной объектно-ориентированной речи.

Если вам нужна фабрика с параметрами, вам следует рассмотреть возможность добавления дополнительной функции init() к возврату вашего завода, что изменит локальную переменную внутри фабрики. Затем это закрытие можно использовать для сохранения состояния через контроллеры или директивы.

+0

@Dameas: Мне сложно понять, как строка «luke» передается аргументу в функции VaderClass., Даже если вызывается функция конструктора VaderService. (Где нет аргумента) –

+0

AngularJS внутренне вызывает функцию один раз с новым , Аргументы фабричной функции пусты, так как они используются для ввода зависимостей. – Darneas

+0

Можете ли вы, пожалуйста, прокомментировать, что внутренне вызывает Fn AngularJs, о котором вы упомянули в своем комментарии. Это VaderService или VaderClass? –

0

Просто понять, что VaderClass является конструктором. Завод только создает другой глобальный конструктор VaderService, который делает то же самое.

var myfact = function(name, constructor_closure){ 
    window[name] = constructor_closure() 
} 
+0

Вы уверены, что VaderClass - это функция-конструктор, а не только нормальный fn. –

+0

@shirgill_ansari каждая функция js может использоваться как конструктор –

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