我正在使用ui-router并尝试实例化一个小部件,该小部件将 id 指定的 DOM 元素作为参数。这个 DOM 元素在 a 中<div ng-switch>
,我想在保证元素存在时调用小部件构造函数。
<div ng-switch on="state">
<div ng-switch-when="map">
<div id="map"></div>
</div>
</div>
从ui-router 生命周期中,我知道我应该挂钩到$viewContentLoaded
. 但是,这不起作用 - 此时ng-switch
未创建 DOM 元素:
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('/', {url: '/', templateUrl: 'index.html'})
.state('map', {url: 'map', templateUrl: 'map.html', controller: 'MapCtrl'})
}]);
app.controller('MapCtrl', ['$rootScope', '$scope', '$state', function MapCtrl($rootScope, $scope, $state) {
$scope.state = $state.current.name; // expose the state to the template so we can ng-switch. Apparently there's no better way: https://github.com/angular-ui/ui-router/issues/1482
$scope.$on('$viewContentLoaded', function mapContentLoaded(event, viewConfig) {
var mapElement = document.getElementById('map');
console.log('Attempting to create map into', mapElement);
var map = new google.maps.Map(mapElement); // <-- but mapElement will be null!
});
}]);
起作用的是setTimeout()
在控制器中使用 50ms 的时间,这很脆弱,但到那时 DOM 元素已创建。或者,我可以设置一个间隔,检查map
DOM 元素是否存在,并在找到时清除间隔。
确定何时渲染其 DOM的正确方法是什么?ng-switch
这没有记录在案。
这是Plunkr。