2014-10-17 4 views
1

Итак, я сделал этот Plunker, который хорошо работает как демо: http://plnkr.co/edit/Zm9d6zHhrnqDlnJsSZ1I?p=preview. Это простая разбивка на страницы с двумя атрибутами атрибутов, которые содержат состояние модели и некоторое конфигурационное состояние. Я хочу закончить с директивой завода, как это (или что-то объяснить, как рассуждать по-разному):Разделение контроллера директивы на более мелкие части

angular.module('mnPagination').factory(function(model, config) { 
    return { 
    model: model, 
    config: config 
    } 
}) 

Моя проблема с текущим plunker является то, что приложение слой и слой директивы не похожи друг на друга. Поскольку у меня есть только одно приложение, я могу использовать фабрики в качестве поставщиков одиночных данных. Это действительно хорошо!

Но внутри директивы я не могу использовать какой-либо провайдер, так как это будет синглтон. Сфера действия - это новый объект для каждого объявленного экземпляра, так что это единственное место, где я могу поместить любой код состояния, который должен содержаться в директиве.

Директивы должны быть без гражданства?

Еще один мета-вопрос: Я единственный, кто волнуется об этом?

Это моя вторая попытка SO, и никто на facebook или на работе действительно это в MVVM/MVC или директивы с изолированной областью.

Я Лэй, приди, будь моим Люком!

+0

Мне интересно, может ли помочь вам получить доступ к родителям областей из контроллера директивы? Не уверен, насколько это было бы чисто. – user1441287

+1

Я пытаюсь понять ваш вопрос. Разделение контроллера на более мелкие части: это о создании «помощников контролера» или «частей функциональности» для объединения вместе? Можете ли вы немного разобраться в этом (мне любопытно, это может быть полезно для меня). – Bernard

+0

@ user1441287: Доступ к родительскому охвату для меня был бы непротиворечивым. Я хочу как можно большего разделения, поэтому я могу легко заменить код и легче понять свой код, не глядя в родительскую область. –

ответ

1

Таким образом, я решил это, создав фабрику внутри угловой фабрики.

angular.module('mnPagination').factory('mnPaginationFactory', function() { 
    var factory = function (items, config) { 
    ... 
    } 

    return factory 
} 

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

Plunker здесь: http://plnkr.co/edit/DPTZUjeMihsva5nJ3IVx?p=preview.

+0

Моя первая реакция на эту двойную фабрику заключается в том, что вы катализируете свою фабричную систему и работаете с системой поставщиков инжекторов. Я имею в виду, почему бы не использовать .provider ({$ get: function}). Это может сделать трюк с несколькими экземплярами, который вы ищете. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не тестировал это, и я мог ошибаться, это вытекает из документов. Из документов: https://docs.angularjs.org/api/auto/service/$provide#provider _ "Объект: тогда он должен иметь метод $ get. Метод $ get будет вызываться с использованием $ injector.invoke(), когда нужно создать экземпляр. "_ – Bernard

+0

Это была моя первая мысль, но поставщик. $ get вызывается только один раз, поэтому я думаю, что мне нужно создать новый инжектор $ для каждого экземпляра директивы или вызовите поставщика. $ получите несколько раз. Что я видел в .NET DI-системах, вы можете настроить инжектор, чтобы каждый раз возвращать новый экземпляр или просто синглтон.Мне сейчас не хватает этого выбора. –