2016-05-29 3 views
0

Я пытаюсь написать завод и использовать его в одном из моих контроллеров, но это дает мне ошибку:Factory не является функция в моем контроллере

TypeError: wordsToTrain is not a function

Я сделал мой контроллер и завод очень простым, но до сих пор Don `T понимаю, почему это происходит:

angular.module('bananaApp') 
    .controller('TrainingCtrl', [ '$scope', 'wordsToTrain', function ($scope, wordsToTrain) { 
    wordsToTrain(); 
    }]); 

angular.module('bananaApp') 
    .factory('wordsToTrain', function() { 
    return 3; 
    }); 
+0

В контроллере wordsToTrain будет равен 3, то, как угловая DI работает – csharpfolk

+0

Вот что выглядит как хороший учебник по AngularJS DI: HTTP: // henriquat.re/basics-of-angular/services-dependency-injection/services-and-dependency-injection-in-angularjs.html – csharpfolk

+0

Возможно, вам стоит ознакомиться с руководством разработчика AngularJS [Services] (https: //docs.angularjs. org/guide/services) и [DI] (https://docs.angularjs.org/guide/di). – ryeballar

ответ

1

Вы пытаетесь создать экземпляр значения. Ваш завод не возвращает функцию, вместо которой он возвращает значение.

angular.module('bananaApp') 
    .controller('TrainingCtrl', [ '$scope', 'wordsToTrain', function ($scope, wordsToTrain) { 
    console.log(wordsToTrain) //this would give you 3 not a function; 
    }]); 

angular.module('bananaApp') 
    .factory('wordsToTrain', function() { 
    return 3; 
    }); 

// Чтобы вернуть функцию

angular.module('bananaApp') 
    .controller('TrainingCtrl', [ '$scope', 'wordsToTrain', function ($scope, wordsToTrain) { 
    console.log(wordsToTrain()) // this would give you 3 as well but this is a function; 
    }]); 

angular.module('bananaApp') 
    .factory('wordsToTrain', function() { 
    return function() { 
     return 3; 
    }); 
1

Попробуйте определении вашей службы, как это:

angular.module('bananaApp') 
    .factory('wordsToTrain', function() { 

    var wordsToTrain = {}; 

    wordsToTrain.getValue = function() { 
     return 3; 
    } 
    return wordsToTrain; 
    }); 

И использовать его как это:

var value=wordsToTrain.getValue(); 
+0

Вам не хватает возвратных словToTrain в вашей заводской функции – csharpfolk

0

Factor возвращает объект & вы можете прикрепить метод этой фабрики функции.

Рядом с примечанием [] in angular.module.

Параметр [] в определении модуля может использоваться для определения зависимых модулей. Без параметра [] вы не создаете новый модуль, а получаете существующий.

angular.module('bananaApp',[]) 
     .controller('TrainingCtrl', [ '$scope', 'wordsToTrain', 
        function ($scope, wordsToTrain) { 
     console.log(wordsToTrain.three()); 
     }]); 

    angular.module('bananaApp').factory('wordsToTrain', function() { 

     var _factory ={}; 
     _factory.three = function(){ 
     return 3; 
      } 
     return _factory; 
     }); 

Demo здесь

+0

Вы правы. Спасибо. –

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