2013-03-12 4 views
28

У меня естьПочему я не могу вводить угловые печенья?

<body ng-app="myApp"> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-cookies.min.js"> 
    </script> 
</body> 

Everything нагрузки правильно.

Тогда в моей JavaScript я пытаюсь привнести ngCookies:

angular.module("myApp", ["ngCookies"]). 
    config(function($cookies) { 
     console.log($cookies.myCookie); 
    }); 

Но это, кажется, не найти $ печенье:

Unknown provider: $cookies from myApp 
+0

Как указано в Угловой документации (http://docs.angularjs.org/guide/module) - Загрузка модулей и Зависимости - * Блоки конфигурации - выполняются во время регистрации и конфигурации поставщика. Только поставщики и константы могут быть введены в конфигурационные блоки *. Вот почему вы получаете ошибку 'Unknown provider: $ cookies из myApp', поскольку' $ cookie' является сервисом и поэтому недоступен в блоке 'config'. – Tom

ответ

28

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

Вы можете вводить услуги в блоки запуска, но я не знаю, помогает ли это вам, так как я не уверен, что вы пытаетесь сделать с этими куки.

BTW: кажется, вы смешиваете версии основного углового файла и модуля ngCookies. Это не связано напрямую с вашей проблемой, но это довольно странно.

+1

Спасибо. Что вы подразумеваете под «версиями микширования»? Мне не нужны угловые куки для модуля ngCookies? –

+1

@JeffWong путем смешивания версий Я имею в виду, что вы включили главный угловой модуль в версии 1.0.3, а ngCookies - в версию 1.0.1. Обычно оба варианта должны быть одинаковыми. –

+0

Бегущие блоки были правильным ответом. Кстати, что такое «константы» в этом контексте? –

-11

Вы должны вводить с именем $cookieProvider вместо $cookies:

angular.module("MyApp", ["ngCookies","ngRoute"]) 
    .config(["$routeProvider", "$locationProvider","$cookiesProvider", 
     function($routeProvider, $locationProvider, $cookies) { 

     } 
    ]); 
+0

Как использовать $ cookiesProvider для получения значения cookie? – angelokh

+0

$ cookieProvider не работает в config. – angelokh

+4

Это неправильный ответ, если кому-то еще любопытно. В ngCookies нет такой вещи, как $ cookProvider-сервис. Не только это, но и фабрики внутри ngCookies не загружаются, пока ПОСЛЕ запускает функция конфигурации. –

11

Вы можете впрыснуть его вручную:

myApp.config(function() { 
    var $cookies; 
    angular.injector(['ngCookies']).invoke(['$cookies', function(_$cookies_) { 
    $cookies = _$cookies_; 
    }]); 

    // here you can use $cookies as usual 
}); 

Вы можете спросить, почему мы должны указать ngCookies к injector() вызова, а также к вызову .invoke()?

ngCookies - это название модуля (в этом проекте вам понадобится angular-cookies.js, чтобы иметь возможность использовать этот модуль). Когда вы создаете инжектор, вызывая injector(), вы указываете, какие модули следует использовать, чтобы можно было использовать сервисы из этих модулей.

invoke() вызывает функцию, но давайте вы указать, какие услуги (предоставляемые различными модулями), должны быть переданы в функцию (в нашем случае услуги, предоставляемые ngCookies модуль с именем $cookies)

Это решение является немного взломать, потому что вы вручную создаете новый инжектор отдельно от того, который автоматически создается и использует ваше угловое приложение, но он должен быть безопасным, потому что ngCookie, по-видимому, использует только функциональные углы, которые не сохраняют свое собственное состояние и являются лишь тонкими обертками функциональности браузера.

+0

Я делаю это, и он отлично работает, пока не будет изменен, и в этот момент он ломается ужасно. Я заметил, что _ $ cookies _, если они меняются, прерывается, несмотря на аннотацию инжектора, которая * должна * быть мини-безопасной. _ $ cookies_ недоступен в источнике ngCookies, а это означает, что _ $ cookies_, вероятно, является частью магии углов. Нужно исследовать (если только вы не нашли способ смириться с этим уже ....) – dudewad

+0

В записи SO не позволит мне помещать символы подчеркивания. Извините за путаницу. Я пытался. – dudewad

+0

@dudewad Я улучшил свой ответ, чтобы работать с неглазурованным предупреждением. –

0

https://stackoverflow.com/a/18971123/132374 С, похоже, что вам нужно delare «ngCookies» в вашем служебном модуле, если вы еще не:

var serviceModule = angular.app('App.services', ['ngCookies']); 

Это работало для меня. Имейте в виду, что $cookies работает только там, где Angular позволяет вам вводить услуги (подробнее см. Принятый ответ).

2

Я столкнулся с той же проблемой. угловая версия и угловая версия для печенья не совпадают. что я сделал, чтобы исправить это обновление bower.json для рабочих версий обоих.

"angular": ">=1.2.*", 
"angular-cookies": ">=1.2.*" 

Тогда я побежал:

bower install 

я получил этот вопрос:

Unable to find a suitable version for angular, please choose one: 
1) angular#1.3.13 which resolved to 1.3.13 and is required by angular-cookies#1.3.13 
2) angular#>=1.2.x <=1.4.x which resolved to 1.3.16 and is required by oclazyload#1.0.1 
3) angular#1.4.0 which resolved to 1.4.0 and is required by angular-cookies#1.4.0 
4) angular#>=1.2.* which resolved to 1.4.0 and is required by hashve 
5) angular#>=1 which resolved to 1.4.0 and is required by angular-bootstrap#0.11.2 
6) angular#>=1.2.26 <=1.5 which resolved to 1.4.0 and is required by angular-translate#2.7.2 
7) angular#~1.x which resolved to 1.4.0 and is required by restangular#1.5.1 
8) angular#^1.2.6 which resolved to 1.4.0 and is required by angular-socket-io#0.6.1 
9) angular#>= 1.0.8 which resolved to 1.4.0 and is required by angular-ui-router#0.2.15 
10) angular#>=1.2.0 <1.5.0 which resolved to 1.4.0 and is required by angular-moment#0.10.1Prefix the choice with ! to persist it to bower.json 

Тогда я выбрал 3.

и он работал.

0

Как и все остальные, вы не можете использовать услугу углового печенья. Тем не менее, для человека нет закона, который говорит, что вы не можете просто использовать document.cookie для доступа к нему и самостоятельно разобрать его. Кроме того, вы можете создать своего собственного провайдера, который предоставит вам доступ к файлам cookie, и вы можете это добавить. Пожалуйста, помните, что угловой - это просто фреймворк, и когда у рамки есть ограничения, вы должны помнить, что используете что-то, называемое javascript.

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