2014-12-19 3 views
1

У меня есть Угловая служба, написанная как класс coffeescript. Основы работы в порядке, но я изо всех сил, чтобы добавить функцию $ таймаута (который должен называть закрытым способом):

class AlertService 
    constructor: ($timeout) -> 
    @timeout = $timeout 
    @alerts = [] 

    getAlerts: -> @alerts 

    addAlert: (type, msg) -> 
    alert = {type: type, msg:msg} 
    @alerts.push alert 
    @timeout ****Can't work out what goes here ****** 

    closeAlert: (alert) -> 
    @alerts = @alerts.filter (x) -> x isnt alert 

AlertService.$inject = ['$timeout'] 
app.factory 'alertService', -> new AlertService 

Все, что я пытался просто в результате которого у «не определено не является функцией» ошибка.

Может ли кто-нибудь указать мне правильное направление?

+0

Я думаю newing вверх вызывает проблему. пусть угловой предоставить вам экземпляр. 'app.factory 'alertService', -> AlertService' try chaingin it to' app.factory 'alertService', AlertService' – PSL

+0

Может быть что-то там, но теперь он дает «Provider» alertService 'должен вернуть значение из $ get фабричный метод. ' – Owen

+0

Я не уверен насчет coffeescript. Но я думаю, вы могли бы просто использовать сервис вместо фабрики – PSL

ответ

1

Похоже, что вам нужен сервис, а не фабрика.

Try: -

class AlertService 

    @$inject = ['$timeout'] 

    constructor: ($timeout) -> 
    @timeout = $timeout 
    @alerts = [] 

    getAlerts: -> @alerts 

    addAlert: (type, msg) -> 
    alert = {type: type, msg:msg} 
    @alerts.push alert 
    @timeout (=> @closeAlert(alert)), 2000 


    closeAlert: (alert) -> 
    @alerts = @alerts.filter (x) -> x isnt alert 

app.service 'alertService', AlertService 
+0

вот что @garbanzio, кажется, тоже говорит ниже – Owen

+0

@Owen Я просто использовал это для преобразования в js и работал, и он работает. Попробуйте фрагмент в моем примере. У вас не должно быть новых продуктов, это приведет к тому, что все, что вводится с использованием углового DI, будет игнорироваться при новом обновлении. – PSL

+0

Что такое '@timeout **** Не удается определить, что здесь происходит ******, код у вас есть? Я не эксперт по кофе, но использую конвертер для создания скрипта. – PSL

0

Это должно выглядеть примерно так:

app.service 'AlertService', ['$timeout', class AlertService 
    constructor: (@$timeout) -> 
    @alerts = [] 

    getAlerts: -> @alerts 

    addAlert: (type, msg) -> 
    alert = {type: type, msg:msg} 
    @alerts.push alert 
    #this could probably be written a little better, but should work 
    @$timeout ((alert) -> @closeAlert(alert)).bind(@, alert), 2000 

    closeAlert: (alert) -> 
    @alerts = @alerts.filter (x) -> x isnt alert 

] 

Жир стрелка (=> в отличие от ->) будет связать свой this экземпляр в Clojure. Обратный вызов для функции тайм-аута находится внутри парнеров, а второй параметр (длина таймаута) - 2000.

Когда я сомневаюсь, я всегда проверяю свой coffeescript с помощью компилятора coffeescript-> js.

+0

, который все еще дает ошибку 'undefined is not a function' – Owen

+0

Я думаю, что 'AlertService. $ Inject = ['$ timeout']' точно не компилируется, как ожидалось. В этом ответе http://stackoverflow.com/questions/18032068/purpose-of-square-bracket-use-in-angular#answer-18033952, Angular + Coffeescript требует использования синтаксиса скобки для инъекции зависимостей. Используйте синтаксис скобки, как указано [здесь] (http://benhollis.net/blog/2014/01/17/cleanly-declaring-angularjs-services-with-coffeescript/). Или просто переключитесь на простой js. – garbanzio

+0

@Owen сообщите мне, если это сработало, и я обновлю ответ. :) – garbanzio

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