1

Скажет, у меня есть некоторая угловая разметка, как:AngularJS: Привязка к transclusive директивы без выделения сферы

<custom bindTo="modelProperty"> 
    <!-- Trascluded content. --> 
</custom> 

было бы возможен для пользовательской директивы, чтобы связать с помощью атрибута bindTo, позволяя свойства должны быть доступны к транслированному контенту, не изолируя объем пользовательских? В принципе, я хочу, директива для привязки к пользовательской части модели, не отрезая его от прицелов своих родителей и без добавления дополнительного кода, как:

scope.prop = scope.$parent.prop; 

Любые идеи?

EDIT Я предполагаю, что это будет структурирована что-то вроде http://plnkr.co/edit/zq2OO1?p=preview, кроме работать и без изолята сферы.

+0

Я не думаю, что вы не можете сделать это без poluting объема оберточную (например, с помощью 'bindTo'). И если вы огласите область обертывания, тогда она сломается, если на странице будет более 1 'custom' директив. – gkalpak

+0

@ExpertSystem Я думаю, что они должны это сделать, если они используют 'scope: true' и передают эту область в функцию transclude в качестве первого аргумента (проверьте мой ответ) –

+0

@MarcKline: Да, я имел в виду, что они не могут разделяют сферу действия. Ваш подход прекрасен до тех пор, пока прототипное наследование не будет на вашем пути (например, вам не нужно обновлять примитивное значение из элемента transcluded). Но кроме этого он действительно работает. – gkalpak

ответ

2

Используя scope: true, вы можете поддерживать доступ к свойствам родительской области с помощью прототипического наследования при сохранении уникальных областей для каждого экземпляра директивы (т. Е. Чтобы она была повторно использована). (Примечание: Убедитесь, что вы наблюдаете the dot rule для любых моделей, которые необходимо изменить в родительской области внутри включено через содержание)

Вам нужно вызвать transclude функции из функции compile, передавая сферу Директивы как первые аргумент, чтобы связать транслируемый контент с ним.

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

.directive('custom', function() { 
    return { 
    restrict: 'E', 
    transclude: true, 
    scope: true, 
    link: function(scope, elem, attrs, ctrl, transclude){ 
     scope.bindTo = scope[attrs.bindTo]; 
     transclude(scope, function(clone){ 
     elem.find('ng-transclude').replaceWith(clone); 
     }); 
    }, 
    template: '<div>From parent scope: <i>{{someVar}}</i> <ng-transclude></ng-transclude></div>' 
    } 
}); 

Demo

+0

Обратите внимание, что согласно документам 'compc'''''''' [устаревший]' compile' (https: // docs.angularjs.org/api/ng/service/$compile#-compile-)**, поэтому вы должны использовать 'transclude'' link'. – gkalpak

+0

Не видел этого. Я только что обновил свой ответ и демо, чтобы это отразить. Благодарю. –

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