2014-12-30 2 views
11

Я учусь директивы AngularJS, и одна вещь, которую я хочу сделать, это пройти в материнской scopescope из controller) некоторую переменную $scope.message, и я хочу, чтобы это было переименовано в param внутри directivealert. Я могу сделать это с помощью изолированной сферы:Pass переменной AngularJS директивы без изолированного объема

<div alert param="message"></div> 

и определить

.directive("alert", function(){ 
    return{ 
     restrict: "A", 
     scope: { 
      param: "=" 
     }, 
     link: function(scope){ 
      console.log(scope.param) # log the message correctly 
     } 
    } 
}) 

Но я могу сделать это без использования изолированной сферы? Предположим, я хочу добавить еще directivetoast в <div toast alert></div> и использовать тот же param (сохраняя 2-полосная привязки данных), по наивности я сделаю

.directive("toast", function(){ 
    return{ 
     restrict: "A", 
     scope: { 
      param: "=" 
     }, 
     link: function(scope){ 
      console.log(scope.param) 
     } 
    } 
}) 

Я, конечно, получите ошибку Multiple directives [alert, toast] asking for new/isolated scope on:<div...

Так в целом, мой вопрос заключается в том, как переименовать родительскую переменную области без изолированной области и как обмениваться переменными, когда два directives размещены на одном DOM?

+0

Вы хотите, чтобы 2 директивы связывались с одним и тем же родительским свойством '$ scope'? –

ответ

13

Измените тостов директиву:

.directive("toast", function(){ 
    return{ 
     restrict: "A", 
     link: function(scope, elem, attrs){ 
      var param = scope.$eval(attrs.param); 
      console.log(param) 
     } 
    } 
}) 

Example fiddle.

Поскольку тост теперь находится в том же объеме, что и родительский (если бы он был разрешен для выделения области), вы можете просто вызвать $ eval on scope с атрибутом param, чтобы получить значение.

+0

Спасибо, отлично работает! Затем я должен посмотреть на '$ eval()' docs. – Lelouch

+0

ли $ eval() просто возвращает значение или фактически обеспечивает привязку данных? Кажется, он возвращает только значение, но я хочу убедиться. – Lelouch

+1

Это просто значение. Если вам нужно симулировать привязки, вы можете использовать $ watch ... Я считаю, что это может быть чрезмерным, хотя вам просто нужно снова eval, чтобы получить самое последнее значение (например, для некоторого ngEvent). – Patrick

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