나는 ui-sref directive의 source code을 연구하여 비슷한 지시문을 만들 수 있는지 여부를 알아 냈지만 현재 상태에 따라 활성 클래스를 설정하는 대신 현재 요소의 가시성을 변경했습니다.
불행히도 ui-router는 그런 식으로 확장되지 않는 것처럼 보입니다. 그러나 나는 내 지시문을 함께 해킹 할 수있다. parseStateRef
및 stateContext
은 다른 코드에서 액세스 할 수없는 ui-router 소스 코드의 & 붙여 넣기 기능입니다.
소스 코드는 의도 한대로 현재 프로젝트에서 작동하지만 필자는 프로젝트에서 생각할 필요가없는 부분을 놓치게됩니다.
어쨌든 : 사용은 <... show-on-sref="targetState">
이됩니다. 필자는 자식 상대 링크 (.someState
과 같은 점으로 시작하는 자식 상대 링크)를 사용하여 지침을 성공적으로 테스트했습니다.
var attributeName = 'showOnSref';
function parseStateRef(ref, current) {
var preparsed = ref.match(/^\s*({[^}]*})\s*$/), parsed;
if (preparsed) ref = current + '(' + preparsed[1] + ')';
parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/);
if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'");
return { state: parsed[1], paramExpr: parsed[3] || null };
}
function stateContext(el) {
var stateData = el.parent().inheritedData('$uiView');
if (stateData && stateData.state && stateData.state.name) {
return stateData.state;
}
}
angular
.module('showOnSref', [])
.directive(attributeName, ['$state', function($state) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
var ref = parseStateRef(attrs[attributeName], $state.current.name),
linkedState = $state.get(ref.state, stateContext(element)),
params = angular.copy(scope.$eval(ref.paramExpr)),
inactiveClass = 'ng-hide',
bind = angular.bind,
show = bind(element, element.removeClass, inactiveClass),
hide = bind(element, element.addClass, inactiveClass),
update = function() {
$state.includes(linkedState.name, params) ? show() : hide();
};
scope.$on('$stateChangeSuccess', update);
}
};
}]);