当前位置: 首页 > 面试题库 >

AngularJS:在出现部分视图之前触发了$ viewContentLoaded

曾成天
2023-03-14
问题内容

对于局部视图,我想做一些我通常会使用的JavaScript东西$(document).ready(function() {...}),例如将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-routerui-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">

[...]

一旦ng-if从div标签中删除,它就会按预期工作。呈现DOM后触发事件,因此jQuery找到了元素。如果将ng- ifd附加到div标记,则行为将首先描述。

更新2: 如我所愿,我添加了一个工作演示,该演示显示了添加ng- if指令时的不同行为。谁能为我指出正确的方向?不要像这样使用登录表单,因为还有更多用例,在这些用例中,我想基于某种表达式删除视图的某些部分,并在部分视图准备好后做一些JavaScript事情。

您可以在此处找到有效的演示:演示


问题答案:

这与角度摘要循环有关,与角度如何在引擎盖下工作,数据绑定等有关。有很多很棒的教程对此进行了解释。

要解决您的问题,请使用$ timeout,它将使代码在下一个周期执行(如果已解析ng-if):

app.controller('LoginController', function ($scope, $timeout) {
    $scope.$on('$viewContentLoaded', function(event) {
      $timeout(function() {
        $scope.formData.value = document.getElementById("loginForm").id;
      },0);
    });
});

在此处修复了演示:http :
//codepen.io/anon/pen/JoYPdv



 类似资料:
  • 问题内容: 对我的应用程序使用的各种视图使用单独的样式表的正确/可接受的方法是什么? 目前,我在视图/部分的html顶部放置了一个link元素,但有人告诉我这是一种不好的做法,即使所有现代浏览器都支持它,但我可以理解为什么对此不满意。 另一种可能性是将单独的样式表放在我的index.html中,但是我希望它仅在以性能名义加载其视图时才加载样式表。 这是不好的做法吗,因为样式只有在将css从服务器加

  • 我有一个jdbc客户机与postgresql数据库通信。从JDBC中创建一条准备好的语句,用于在表中插入一些数据,但在创建查询时,客户机不知道要在语句中插入的所有字段,为了完成查询,我编写了一个触发器,在该表上插入之前触发,找到缺少的值,继续执行查询。这是jdbc代码: 这是触发代码: 当触发器触发时,我有一个错误: 这是什么意思?记录新的,正如你在jdbc代码中看到的那样。。。

  • 问题内容: 嗨,我想知道在使用angularjs上传图像之前是否可以预览图像?我正在使用这个图书馆。https://github.com/danialfarid/angular- file-upload 谢谢。这是我的代码: template.html controller.js 问题答案: OdeToCode为这个东西发布了很棒的服务。因此,通过此简单的指令,您可以轻松预览甚至查看进度栏: 它适

  • 我正在使用ng-view来包含AngularJS部分视图,并且我想基于包含的视图更新页面标题和h1头标签。但是,这些都超出了部分视图控制器的范围,所以我无法确定如何将它们绑定到控制器中的数据集。 如果是ASP.NET MVC,您可以使用@ViewBag来完成此操作,但我不知道AngularJS中的等同功能。我已经搜索了共享服务,事件等,但仍然不能使它工作。任何方法来修改我的例子,以便它的工作将是非

  • 问题内容: 我在应用程序中使用JavaFX Webview。使用以下代码,我在页​​面加载后设置了一个成员 现在在javascript中,mymember.doSomething()当我按下按钮并成功执行时,我可以调用例如被调用,但是如果我将以下代码添加到html中, 页面加载后不会自动执行。好像window.onload在LoadWorker被通知之前就已执行。因此mymember尚未设置。但是

  • 也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?