对于一个局部视图,我想要执行一些通常用$(document).ready(function() {...})
完成的 JavaScript 操作,比如将事件监听器绑定到元素上。但我知道这在 AngularJS 和加载到“根”视图中的局部视图中不起作用。
因此,我在控制器中添加了一个监听器来监听 $viewContentLoaded
事件。监听器函数被调用,所以事件被触发,但是似乎在局部视图渲染之前。当我在监听器函数中设置断点并使用 firebug 进行调试时,看不到元素,也不能通过该函数内的 jQuery 选择器找到局部视图的元素。
这是控制器的样子:
angular.module('docinvoiceClientAngularjsApp')
.controller('LoginController', function ($scope, $rootScope) {
$scope.$on('$viewContentLoaded', function(event) {
console.log("content loaded");
console.log($("#loginForm")); // breakpoint here
});
[...]
如果这是一个常见的错误,stackoverflow 上应该有更多的帖子,我猜我做错了什么。
由于我正在使用 ui-router 和 ui-view,我将给您提供路由文件的摘录:
angular
.module('docinvoiceClientAngularjsApp', [
'ui.router',
'ngAnimate',
'ngCookies',
'ngResource',
'ngMessages',
'ngRoute',
'ngSanitize',
'ngTouch'
])
.config(function ($routeProvider, $stateProvider) {
$stateProvider
.state('login', {
url: '/',
templateUrl: 'components/login/loginView.html',
controller: 'LoginController'
})
.run(['$state', function ($state) {
$state.transitionTo('login');
}])
[...]
非常感谢您的帮助。谢谢并致以诚挚的问候。
更新1:我将错误简化为以下用例:loginView.html如下所示:
<div id="loginContainer" style="width: 300px">
<form id="loginForm" ng-submit="login(credentials)" ng-if="session.token == undefined">
[...]
一旦我从div标签中删除ng-if
,它将按预期工作。事件在DOM呈现后触发,因此jQuery会找到该元素。如果标签附加
您可以在此处找到工作演示:Demo。
ng-if
,则行为与最初描述的相同。
更新2:如承诺所示,我添加了一个工作演示,展示了添加ng-if
指令时不同的行为。有人能指点我正确的方向吗?请不要局限于登录表单本身,因为还有许多用例,在这些用例中,我希望基于一些表达式删除视图的某些部分,并在部分视图准备好后执行一些JavaScript操作。您可以在此处找到工作演示:Demo。