【发布时间】:2015-01-23 15:22:16
【问题描述】:
对于部分视图,我想做一些我通常会用$(document).ready(function() {...}) 做的 JavaScript 东西,例如将 venet 侦听器绑定到元素。我知道这不适用于 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 找到了元素。如果 ng-if 附加到 div 标记,则行为如前所述。
更新 2: 正如所承诺的,我添加了一个工作演示,显示了添加 ng-if 指令时的不同行为。谁能指出我正确的方向?不要拘泥于登录表单,因为还有更多用例,我想根据某些表达式删除视图的某些部分,并在部分视图准备好后执行一些 JavaScript 操作。
您可以在此处找到工作演示:Demo
【问题讨论】:
-
你可以为你的 DOM 东西创建一个指令。
-
我已经根据您的代码创建了一个working demo,它工作正常。下次请尝试自己提供演示。
-
非常感谢工作演示。我已经更新了描述,因为我发现 ng-if 会导致不同的行为。你知道为什么它的行为不同吗?表达式被评估为“真”,因为我可以看到登录表单,只是太晚了;)
-
我稍后会添加一个工作演示并发布链接以供进一步调查。
-
DOM 是通过 $digest 循环迭代构建的。一旦 ui-view 编译了模板,并且控制器已经执行,$viewContentLoaded 就会被触发。 dom 可能会在下一次 $digest 时更改,以响应控制器中发生的某些事情,或其他任何事情。没有很好的机制来复制 document.ready() 样式的 jquery。
标签: jquery angularjs dom angular-ui-router ready