【发布时间】:2014-12-22 03:59:26
【问题描述】:
我正在使用ui-router 并尝试实例化一个以id 指定的DOM 元素作为参数的小部件。此 DOM 元素位于 <div ng-switch> 中,我想在保证元素存在时调用小部件构造函数。
<div ng-switch on="state">
<div ng-switch-when="map">
<div id="map"></div>
</div>
</div>
从ui-router lifecycle,我明白我应该挂钩$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!
});
}]);
起作用的是在控制器中使用 50 毫秒的 setTimeout(),这很脆弱,但到那时 DOM 元素已创建。或者,我可以设置一个间隔,检查 map DOM 元素是否存在,并在找到时清除该间隔。
确定ng-switch 何时呈现其DOM 的正确方法是什么?这个isn't documented。
这是Plunkr。
【问题讨论】:
-
您正在通过同时使用 dom 方法和 angular 方法来混合隐喻/域,这对于 angular 来说效果不佳。使用指令或模板来操作 mapElement 而不是 dom 方法。
-
你打算用
mapElement做什么?不管是什么,@dandavis 都是正确的,你通常只想在指令中进行 DOM 操作。 -
@EstebanFelix:我想实例化一个谷歌地图。刚刚更新了问题。我应该怎么做?使用 ui-router 状态而不是 ng-switch?
-
幸运的是,有很多谷歌地图组件准备好去角,搜索一个
-
@dandavis:我知道。最受欢迎的两个无缘无故地依赖 jQuery,这对我的客户来说是不可接受的。我已经为此提交了 GitHub 问题,例如here.
标签: javascript html angularjs angular-ui-router ng-switch