【发布时间】: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