2013-11-26 5 views
4

Моя фабрика не определена в моем контроллере, и я не могу понять, почему. Я создал простой пример для иллюстрации.AngularJS: Почему моя фабрика всегда не определена в моем контроллере?

Здесь я создаю приложение:

var ruleApp = angular 
    .module("ruleApp", [ 
     "ngRoute", 
     "ruleApp.NewFactory1", 
     "ruleApp.NewFactory2", 
    ]); 

В этом примере манекена я хотел бы построить завод, который делает что-то простое, показать окно предупреждения. Я покажу два способа сделать это (один работает, а другой нет).

Фабрика 1:

angular 
    .module('ruleApp.NewFactory1', []) 
    .factory('NewFactory1', function() { 
     return function(msg) { 
      alert(msg); 
     }; 
    }); 

Factory 2:

angular 
    .module('ruleApp.NewFactory2', []) 
    .factory('NewFactory2', function() { 
     var showMessageFunction = function(msg) { 
      alert(msg); 
     }; 
     return 
     { 
      showMessage: showMessageFunction 
     }; 
    }); 

Обратите внимание на тип возврата фабрики 1 является функцией и тип возвращаемого завода 2 представляет собой объект с свойство (которое имеет функцию типа).

Теперь посмотрим на то, как я хотел бы использовать оба этих заводов в моем контроллере:

ruleApp.controller("RuleController", function($scope, NewFactory1, NewFactory2) { 
    NewFactory1("1"); 
    NewFactory2.showMessage("2"); 
}); 

Здесь проблема не подвергается. Во время выполнения мне сообщается окно предупреждения для NewFactory1("1");, но оно не выполняется во время выполнения NewFactory2.showMessage("2");, потому что NewFactory2 не определено (TypeError: Невозможно вызвать метод showMessage неопределенного).

Можете ли вы помочь мне выявить проблему? Я хочу иметь возможность использовать такие фабрики, как NewFactory2, потому что я хочу, чтобы фабрики могли делать больше, чем одну вещь (т. Е. Иметь более одной единственной функции). Кстати, я использую Angular 1.2.1.

+0

Вы должны попытаться воспроизвести это в plunker. – Stewie

ответ

5

завод 2 должен быть (demo)

angular 
.module('ruleApp.NewFactory2', []) 
.factory('NewFactory2', function() { 
    var showMessageFunction = function(msg) { 
     alert(msg); 
    }; 
    return { // <--------- do not go on a new line after return 
     showMessage: showMessageFunction 
    }; 
}); 
+0

Это сработало. Проблема была в пробеле. Извлеченный урок уделяет очень пристальное внимание белому пространству в угловом. – Trevor

+3

Это не угловатое. Это javascript. См. Http://stackoverflow.com/questions/3641519/why-does-a-results-vary-based-on-curly-brace-placement – dnc253

+0

О, мой глобус! Пробел был серьезным вопросом. Теперь, когда я думаю об этом, это имеет смысл. Затем следует быть осторожным при использовании определенных IDE (например, Visual Studio), которые могут быть настроены на использование области видимости в стиле новой строки вместо [Египетских скобок] (http://blog.codinghorror.com/new-programming-jargon /). – that0th3rGuy

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