對於局部視圖,我想要做一些JavaScript工作,我通常會使用$(document).ready(function() {...})
(例如,將venet監聽器綁定到元素。我知道這不適用於AngularJS和部分視圖加載到「根」視圖。
因此,我向監聽$viewContentLoaded
事件的控制器添加了一個監聽器。偵聽器的函數被調用,所以事件被觸發,但在我看來,好像它是在部分視圖呈現之前。當我在偵聽器函數中設置斷點並使用螢火蟲進行調試時,也沒有看到這些元素,函數中的jquery選擇也沒有找到部分視圖的元素。
這是控制器的樣子:
angular.module('docinvoiceClientAngularjsApp')
.controller('LoginController', function ($scope, $rootScope) {
$scope.$on('$viewContentLoaded', function(event) {
console.log("content loaded");
console.log($("#loginForm")); // breakpoint here
});
[...]
我想,我做錯了什麼,因爲必須是計算器上的更多內容,如果這是一個常見的錯誤。
由於我使用UI路由器和UI視圖,我會給你的路由文件的摘錄:
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標籤,則行爲如第一次描述。
UPDATE 2:按照承諾,我添加了一個工作演示,顯示添加ng-if
指令時的不同行爲。任何人都可以指出正確的方向嗎?不要拘泥於登錄表單,因爲還有更多的用例,我想根據某些表達式刪除視圖的某些部分,並在部分視圖準備好後執行一些JavaScript。
你可以在這裏找到了工作演示:Demo
您可以爲您創建一個指示DOM的東西。 – dfsq 2014-11-25 14:55:15
我已經根據你的代碼創建了一個[工作演示](http://codepen.io/anon/pen/gbpmQy),它工作正常。下一次,請嘗試自己提供演示。 – hon2a 2014-11-25 15:18:55
非常感謝您的演示。我已經更新了描述,因爲我發現ng-if會導致不同的行爲。你有一個想法,爲什麼它的行爲不同?該表達式被評估爲「真」,因爲我可以看到登錄表單,只是片刻太遲;) – Florian 2014-11-25 15:50:43