【问题标题】:Which event fires when view is rendered in AngularJS?在 AngularJS 中呈现视图时会触发哪个事件?
【发布时间】:2014-02-23 02:37:10
【问题描述】:

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

我设法通过在我的 $viewContentLoaded 监听器中设置 0 毫秒的超时来解决这个问题,但这非常难看。

我正在使用它来解析包含在部分中的 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,但结果相同。

干杯

【问题讨论】:

  • 这是一个很长的话题,但它可能会对您有所帮助。通过快速阅读,我认为这不是一种 angular 的做事方式。相反,建议使用directive 来解决问题。 github.com/angular/angular.js/issues/734
  • 谢谢,我设法使用指令解决了它。作为一个 AngularJS 新手,我很难理解一些概念!
  • 太棒了!我很高兴它成功了!我将评论更改为答案。

标签: javascript angularjs angularjs-view


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据Jess的回答,我另辟蹊径,使用指令解决。

    /**
     * Directive to load LESS stylesheets when inserted.
     * @param {attribute} url url of the stylesheet
     */
    var lessStylesheetDirective = function() {
        var link = function(scope, element, attrs) {        
            var linkElement = $('<link rel="stylesheet/less" type="text/css">');
    
            // when link is called, we don't have the attribute yet, if it's interpolated.
            // see http://stackoverflow.com/questions/11913841
            attrs.$observe('url', function(value) {
                if (!value) return;
    
                if (!window.less) throw new error('LESS global not found!');  
    
                linkElement.href = value;
                less.sheets.push(linkElement);
    
                // we reload everything FIXME: can we reload only this one?
                less.refresh(); 
            });
    
            element.on('$destroy', function() {
                // we remove our style from less, so it won't be parsed again
                less.sheets = less.sheets.filter(function(e) { 
                    return e !== linkElement;
                });
            });
        };
    
        return {
            link: link,
        }
    };
    
    app.directive('lessStylesheet', lessStylesheetDirective);
    

    用法:

    <div less-stylesheet url="{{yourUrlComesHere}}"></div>
    

    【讨论】:

    • 哈。对于它的价值,我在 github 上搜索了 angular 源代码。它实际上发出的事件很少。我从来没有找到在{{ expressions }} 被评估时触发的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多