我正在尝试在运行时 - 服务内部更改父视图模板。
我的应用配置如下:
$stateProvider
.state('base', {
abstract: true,
views: {
'header': {
controller: 'HeaderCtrl',
templateUrl: 'header.html'
},
'': {
template: '<div ui-view="main"></div>'
}
}
})
.state('base.home', {
url: '/',
views: {
'main': {
controller: 'SomeContentCtrl',
templateUrl: 'content.html'
}
}
});
然后我有一个从SomeContentCtrl调用的服务,它将监听一个事件,并且在这样的事件中我想将标头的templateUrl设置为null。类似的东西:
angular
.module('RemoveTemplate', [ ])
.factory('RemoveTemplate', ['$window', '$view', '$state',
function RemoveTemplate ( $window, $view, $state ) {
var windowElem = angular.element($window);
var listen = function ( ) {
windowElem.on('RemoveTemplate', function ( event ) {
$view.load('header@base', {
templateUrl: null
});
// Trying both, even tried without refreshing the state
$state.reload();
$state.go('wh.lobby');
});
};
return {
listen: listen
};
}
]);
});
但这根本不起作用。有没有人之前遇到过类似的用例?
由于
答案 0 :(得分:3)
您可以指定每次导航到状态时运行的templateURL函数。
https://github.com/angular-ui/ui-router/wiki/Quick-Reference#template-templateurl-templateprovider
此方法可以检查是否应该提供网址或其他内容; 例如:
$stateProvider.state('home', {
url: '/',
templateUrl: function () {
if (header === true) {
return 'app/templates/home.html';
} else {
return somethingElse;
}
}
})
答案 1 :(得分:0)
如果你想在不删除html的情况下“隐藏”标题部分,请尝试在标记标记内使用ng-show指令并检查实际状态。
<div ng-show="state.is('base')">
这样你只需要在控制器中注入$ state服务。 当状态为 base 时,div将显示,如果您导航到子状态,它将隐藏。
P.S。 $ state.is返回一个布尔值,此方法也适用于ng-if。