2016-11-29 6 views
1

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

К примеру, у меня есть этот шаблон:

<div class="flex-item-grow flex-item flex-column report-area"> 
    <sv-report sv-reloadable id="reportId"></sv-report> 
</div> 

Здесь sv-reloadable имеет неявное понимание sv-report, но sv-report не имеет ни малейшего представления о о sv-reloadable.

Я определил sv-reloadable как:

angular 
    .module('sv-reloadable', [ 
     'sv.services', 
    ]) 
    .directive('svReloadable', function(reportServices, $timeout) { 
     return { 
      restrict: 'A', 
      controller: function($scope, $timeout) { 
       $scope.$on('parameter-changed', function(evt, payload) { 
        evt.stopPropagation(); 
        $scope.viewModel = getNewViewModel(payload);/* hit the server to retrieve new data */ 
       }); 
      } 
     }; 
    }); 

Теперь $scope в sv-reloadable является родитель сфера sv-report. Я хочу sv-reloadable, чтобы иметь возможность подключить слушателя к области sv-report и изменить свойства этой области. Я понимаю, что можно захватить возможности братьев и сестер, но это создает проблемы при попытке выяснить, к какому элементу он привязан.

я попытался следующее:

link: function(scope, element, attrs) { 
    ele = element; 
    var actualScopyThingy = element.scope(); 
}, 

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

Если это важно, sv-report определяется как ниже, но я хотел бы быть в состоянии держать его же (так как sv-reloadable собирается быть прикреплены к различным элементам, все из которых обязательно имеют viewModel определены на их объем)

return { 
    restrict: 'E', 
    replace: true, 
    templateUrl: 'sv-report/sv-report.tpl.html', 
    scope: { 
     id: '=', 
     reportParameters: '=' 
    }, 
    controller: function ($scope, svAnalytics) { 
     /* unrelated code here */ 
    }, 
    link: function(scope, element, attrs) { 
     initialLoadReport(scope); 
    } 
}; 

ответ

1

после немного рыть вокруг, isolateScope() то, что я после (а не scope()). Директива sv-reloadable будет:

return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      var elementScope = element.isolateScope(); 
      elementScope.$on('parameter-changed', function(evt, payload) { 
       ... 
      }); 
     } 
    }; 
Смежные вопросы