我试图美化一些动态生成的文本。
<div ng-app="Knob" ng-controller="myCtrl">
<pre class="prettyprint">{{text}}</pre>
</div>
var App = angular.module('Knob', []);
App.controller('myCtrl', function($scope) {
$scope.text = "hello world";
})
App.directive('prettyprint', function() {
return {
restrict: 'C',
link: function postLink(scope, element, attrs) {
prettyPrint();
}
};
});
输出:
hello worldtext}}
任何想法为什么?
答案 0 :(得分:3)
可以通过一个小指令来实现。在AngularJs how to call prettyprint?
找到答案我想通过@carlosmantilla
对指令做一点补充您可以在不创建范围变量的情况下实现相同的目标。我在github上添加了这个更正
我认为这应该可以正常工作。
http://jsfiddle.net/yAv4f/143/
var App = angular.module('Knob', []);
App.controller('myCtrl', function($scope) {
$scope.text = "function f1(){int a;}";
})
function replaceText(str)
{
var str1 = String(str);
return str1.replace(/\n/g,"<br/>");
}
app.directive('prettyprint', function() {
return {
restrict: 'C',
link: function postLink(scope, element, attrs) {
element.html(prettyPrintOne(replaceText(element.html()),'',true));
}
};
});
答案 1 :(得分:1)
这是一个迟到的回复,我相信你已经解决了这个问题。然而,可能有一些其他人在这个问题上遇到了绊脚石。我解决了这个使用和改编版本的谷歌代码美化,可以在这里找到:https://github.com/angular/code.angularjs.org/tree/master/1.3.0-beta.3/docs/components/google-code-prettify-1.0.1 只需按照该页面上的说明操作即可。
现在,可以全局调用prettifyPrint()。
(function(){
$('pre').addClass('prettyprint');
prettyPrint();
})();
我把它放在动态模板的底部
答案 2 :(得分:0)
很难说,prettyPrint()应该返回什么?
你不给prettyPrint提供任何论据似乎很奇怪......
顺便说一句,我认为角度滤波器更适合您的需要,而不是指令。
[编辑]
这个使用过滤器“动态”工作:
html:
<div ng-app="Knob" ng-controller="myCtrl">
<!--<input ng-model="text" type="text"/>-->
<pre ng-bind-html-unsafe="text|pretty"></pre>
</div>
js:
var App = angular.module('Knob', []);
App.controller('myCtrl', function($scope) {
setTimeout(function() {
$scope.text = "class Voila {};";
$scope.$apply();
}, 0);
});
App.filter('pretty', function(){
return function(text) {
return prettyPrintOne(text);
}
})
你可以在
看到它您可以取消注释输入以直接更改将要改进的文本
请注意,此版本适用于Angular 1.1.1(您在初始jsfiddle中选择的版本),对于Angular 1.2。*,您必须使用ng-bind-html和ngSanitize模块
最后一点:现在它已经动态改进了,可以删除setTimeOut和$ scope。$ apply(读者的信息)
[/编辑]
答案 3 :(得分:0)
我的指示。它等待$viewContentLoaded
确保其中的模板var({{}}
)已经由angular计算。应该在<pre>
.directive('prettyprint', function() {
return {
restrict: 'C',
link: function postLink(scope, element) {
scope.$on('$viewContentLoaded', function(){
element.html(prettyPrintOne(element.html(),'',true));
});
}
};
});
答案 4 :(得分:0)
请尝试使用ng-bind-html。
<div ng-app="Knob" ng-controller="myCtrl">
<pre class="prettyprint" ng-bind-html="text"></pre>
</div>
app.directive('prettyprint', function() {
return {
restrict: 'C',
link: function postLink(scope, element, attrs) {
element.html(prettyPrintOne(element.html(),'',true));
}
};
});
答案 5 :(得分:0)
我不知道为什么,但是我发现如果你延迟300ms执行prettyprint
功能,它运作良好。见下文:
var App = angular.module('Knob', []);
App.controller('myCtrl', function($scope) {
$scope.text = "hello world";
})
App.directive('prettyprint', function() {
return {
restrict: 'C',
link: function postLink(scope, element, attrs) {
setTimeout(prettyPrint,300);
}
};
});