2013-08-01 3 views
2

Простой корпус: запросите контроллер $scope для создания детской области. Эта новая область применения будет применена к функции привязки $compile, то есть к созданию программной директивы.угловой js: программно создать экземпляр области?

Моя потребность падает только вне scope: true декларации в определении директивы - я делать нужен частный объем директивы, но я не хочу один созданные рамки каждый раз, когда я создаю экземпляр директивы. Скорее, я хотел бы reapply существующий объем для свежей связи - свежая директива.

IOW, я хочу учить новую собаку старым трюкам.

Я говорю о scope obtained from the compiled directive (см.: Извлечение областей из DOM).

Рассмотрите сценарий, в котором представление HTML директивы (назовем ее «половиной») может перемещаться внутри и снаружи документа. Я просто хочу сохранить его состояние (назовем его «другой половиной») и reapply это свежеприготовленный экземпляр с половиной скомпилированных директив.

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

Супер-надуманный plunk для вашего удовольствия.

ответ

4

Если вы хотите создать закрытый объем внутри директивы вы можете использовать scope.$new метод так:

app.directive('colorblock', function ($rootScope) { 

    link: function (scope, iElement, iAttrs, controller) { 
     var privateScope = $rootScope.$new(true); 
    } 
    ... 
}); 

Это создаст изолировать сферу.

+0

Что касается плунжера, то лучше область создается вне директивы. (Plunk обновил выделение прецедента, для тех, кто волнует.) Тем не менее, это отвечает на вопрос. Кто говорит, что угловой документ плохой? * Я делаю. – Steven

+0

Итак, теоретически, вы можете скомпилировать новую директиву (которая имеет некоторые функции в ее области) другой директивой, используя что-то вроде $ compile ('') ($ rootScope. $ New (true);? –

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