2013-07-01 7 views
0

У меня есть страница с несколькими виджетами. После загрузки страницы я получаю список виджетов, который содержит URL-адрес. Затем я указываю URL-адрес.AngularJS: Регистрация в службе

Каждый виджет имеет свой собственный контроллер, который загружается с помощью тега <script> в виджет html. Поскольку список виджетов является динамическим, я не могу загрузить файлы .js виджета при загрузке страницы. (когда я это делаю, все работает нормально.) Я все время получаю сообщение об ошибке.

Я пытаюсь обернуть вызовы $ http в службе, чтобы сделать свой блок контроллера работоспособным.

Вот мой HTML:

<script src="/widget/fooWidget.js"></script> 

<div ng-controller="FooWidgetCtrl"> 
    ... 
</div> 

А вот мой fooWidget.js: (У меня есть Widgets модуля, определенный в файле, который загружается при загрузке страницы)

Widgets.service('FooWidgetSvc', function($http) { 
    this.getSomething = function() { 
     // $http methods 
    } 
}); 

function FooWidgetCtrl($scope, $http, FooWidgetSvc) { 
    FooWidgetSvc.getSomething(); 
    return $scope.FooWidgetCtrl = this; 
} 

И я получаю следующая ошибка:

Error: Unknown provider: FooWidgetSvcProvider <- FooWidgetSvc 
at Error (<anonymous>) 

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

Я могу сделать плункер, если это поможет.

UPDATE

Спасибо за ответы до сих пор. Я создал плункер, чтобы помочь проиллюстрировать мою проблему: http://plunker.co/edit/iKzwnlZ7bNDjmR05qGDC

Я выяснил, как вручную зарегистрировать контроллер и включил его в плункер.

+0

Пожалуйста, поделитесь с plunkr, я создал службы в модулях, которые, как я полагаю, и не столкнулся с какими-либо проблемами, я думаю, что проблема звучит так, как будто у нее нет определения для службы до того, как она ссылается. Контроллер, который использует службу, просто не может быть создан до создания службы, иначе поставщик не сможет найти его, когда он попытается выполнить инъекцию зависимостей. – shaunhusain

+0

@shaunhusain, спасибо за ответ. Я просто добавил plunkr. Сначала создаю службу, затем контроллер. Я могу вручную зарегистрировать контроллер в модуле Widgets, но не могу определить способ ручного регистрации службы. – dob

+1

Посмотрите, помогает ли этот ответ: http: // stackoverflow.com/questions/15250644/angularjs-load-a-controller-dynamiC# answer-15292441 –

ответ

0

Это работает для вас?

Widgets.service('FooWidgetSvc', function($http) { 
    this.getSomething = function() { 
     // $http methods 
    } 
}).controller('FooWidgetCtrl', function($scope, $http, FooWidgetSvc) { 
    FooWidgetSvc.getSomething(); 
} 
+0

Он работает, если я прикрепляю файл '/ widget/fooWidget.js' к голове, но не работает, если он находится внутри fooWidget. HTML. – dob

+0

Опубликовать плункер, если вы не против –

+0

Я только что разместил плункер. Спасибо, что посмотрели! – dob

1

Хорошо, ребята, Извините за обход. Я, наконец, достаточно долго читал documentation, что и выяснил.

Я пытался создать службу после того, как Угловой было переваривается все, что означает, что я должен вручную добавить контроллеры к модулю с помощью $ controllerProvider и услуги для модуля с помощью $ обеспечивают:

var WidgetsControllerProvider = null; 
var WidgetsProvider = null; 

var Widgets = angular.module('widgets', [], function($controllerProvider, $provide) { 
    WidgetsControllerProvider = $controllerProvider; 
    WidgetsProvider = $provide; 
}); 

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

WidgetsProvider.factory('blergWidgetSvc', function($http) { 
    return { 
    getCountry: function(callback) { 
     // code 
    } 
    }; 
}); 

WidgetsControllerProvider.register('blergWidgetCtrl', function($scope, blergWidgetSvc) { 
    // code 
}); 

Я раздвоенный и обновил plunker, чтобы показать мое решение.

+0

Если у вас есть достаточно очков, вы должны принять свой собственный ответ, если это в конечном итоге то, что лучше всего работает, у меня нет времени на то, чтобы прочитать его, но он вернется позже. Рад, что вы его отсортировали. – shaunhusain

+0

@shaunhusain, stackoverflow не позволяет сразу принять мой собственный ответ. Я приму это через 45 минут :) – dob

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