我知道有$viewContentLoaded,但是在AngularJS用范围变量替换占位符之前会触发。

我设法通过在$viewContentLoaded侦听器中将超时设置为0 ms来解决此问题,但这非常丑陋。

我正在使用它来解析包含在partials中的LessCSS样式表,但是我有一个URL前缀字段,在将其传递给LESS之前,我需要替换为样式表URL。

这是我的代码(带有丑陋的hack):

var AccountController = function($scope, UserService) {
    var user = UserService.get();
    $scope.username = user.profile.displayName || user.contact;

    var bindLESSInit = function($scope, linkElementSelector) {
        $scope.$on('$viewContentLoaded', function() {
            var linkElement = document.querySelector(linkElementSelector);
            if (!linkElement) throw new Error('bindLESSInit: link element not found');

            console.log('link href before timeout: ', linkElement.href);
            // BAD: outputs "http://localhost:8282/%5B%5BstaticURLPrefix%5D%5D/static/portal/app/less/account.less"
            setTimeout(function() {
                console.log('link href after timeout: ', linkElement.href);
                // GOOD: outputs "http://localhost:8282/static/portal/app/less/account.less"
                // clear previous view's styles
                less.sheets = less.sheets.filter(function(e) {
                    return e.getAttribute('class') && e.getAttribute('class').match('view-style');
                });
                less.sheets.push(linkElement);
                less.refresh();
            }, 0);

        });
    };

    bindLESSInit($scope, '#account-stylesheet');
};

[...]


这里有一个相关的问题:How can I trigger an event when an angular JS route template has been loaded

我尝试使用$routeChangeSuccess代替,但结果相同。

干杯

最佳答案

这是一个很长的线程,但可能会对您有所帮助。通过快速阅读,我认为这不是做事情的有角度的方法。相反,建议使用directive解决此问题。

https://github.com/angular/angular.js/issues/734

关于javascript - 在AngularJS中渲染 View 时会触发哪个事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21462475/

10-09 17:48