将 CodeMirror 应用于 ng-model-bound textarea
Apply CodeMirror to a ng-model-bound textarea
我正在编写一个非常非常基本的游乐场。出于某种原因,我需要将 html 面板嵌入到 AngularJS 应用程序中。
在 this version 中,我将 JQuery 更改侦听器放入 CSS 面板,并将 CodeMirror 应用于文本区域。它奏效了。
我对在 AngularJS 应用程序中有一个 JQuery 事件监听器感到不舒服,所以我决定将 CSS 面板绑定到 AngularJS 应用程序,并制作this version。但是现在,问题是 CodeMirror 代码(我在下面评论)不再起作用:
HTML:
<body>
<div ng-app="myApp" ng-controller="myCtrl">
HTML:<br>
<textarea rows=10 cols=40 ng-model="area1">html body area</textarea>
<br>CSS:<br>
<textarea id="css" rows=10 cols=40 ng-model="css"></textarea>
</div>
Output:
<section id="output">
<iframe></iframe>
</section>
</body>
JavaScript:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.area1 = "<body>default</body>";
$scope.$watch('area1', function (json) {
render();
}, true);
$scope.css="body {color: red}";
$scope.$watch('css', function (json) {
// CodeMirror does not work anymore
// var cm_opt = { mode: 'css', gutter: true, lineNumbers: false };
// var css_box = document.getElementById("css");
// var css_editor = CodeMirror.fromTextArea(css_box, cm_opt);
render();
}, true);
function render () {
var source = "<html><head><style>" + $scope.css + "</style></head>" +
$scope.area1 +"</html>";
var iframe = document.querySelector('#output iframe'),
iframe_doc = iframe.contentDocument;
iframe_doc.open();
iframe_doc.write(source);
iframe_doc.close();
}
});
有谁知道如何让 CodeMirror 在这里工作?
此外,在 AngularJS 应用程序中使用 JQuery 事件侦听器真的是个坏主意吗?使用 AngularJS + CodeMirror 编写这个游乐场的最佳结构是什么?
编辑 1: 我发现 this thread, then I made a codeMirror directive,效果不佳。 DevTools 在 CodeMirror.fromTextArea(...)
.
处向我显示错误 TypeError: textarea.getAttribute is not a function
Here
我在 angularjs 添加了 Demo For Code 镜像。希望对您有所帮助...
您可以使用
解决OP的第二次尝试的响应
在指令的 link
函数中,您将 elem
参数用作纯 HTML 元素(这是 codemirror 所期望的),但 angular 将其提供为一个 JQLite 包装元素 - 所以基本上你只需要从它获取 HTML 元素并提供 it 给 codemirror,然后它就会工作:
var editor = CodeMirror.fromTextArea(elm[0], cm_opt);
(注意 elem[0]
而不是 elem
)
在 AngularJS 中,使用指令包装基于 JQuery 的逻辑来制作依赖于代码镜像等其他技术的组件并不是一个坏习惯。在某些情况下,您可以自己执行此操作,但也可以使用其他答案中提到的已经构建的第三方库。
无论您做什么,请确保通过使用指令和服务很好地封装非 angular 逻辑。
希望这对您有所帮助。
我正在编写一个非常非常基本的游乐场。出于某种原因,我需要将 html 面板嵌入到 AngularJS 应用程序中。
在 this version 中,我将 JQuery 更改侦听器放入 CSS 面板,并将 CodeMirror 应用于文本区域。它奏效了。
我对在 AngularJS 应用程序中有一个 JQuery 事件监听器感到不舒服,所以我决定将 CSS 面板绑定到 AngularJS 应用程序,并制作this version。但是现在,问题是 CodeMirror 代码(我在下面评论)不再起作用:
HTML:
<body>
<div ng-app="myApp" ng-controller="myCtrl">
HTML:<br>
<textarea rows=10 cols=40 ng-model="area1">html body area</textarea>
<br>CSS:<br>
<textarea id="css" rows=10 cols=40 ng-model="css"></textarea>
</div>
Output:
<section id="output">
<iframe></iframe>
</section>
</body>
JavaScript:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.area1 = "<body>default</body>";
$scope.$watch('area1', function (json) {
render();
}, true);
$scope.css="body {color: red}";
$scope.$watch('css', function (json) {
// CodeMirror does not work anymore
// var cm_opt = { mode: 'css', gutter: true, lineNumbers: false };
// var css_box = document.getElementById("css");
// var css_editor = CodeMirror.fromTextArea(css_box, cm_opt);
render();
}, true);
function render () {
var source = "<html><head><style>" + $scope.css + "</style></head>" +
$scope.area1 +"</html>";
var iframe = document.querySelector('#output iframe'),
iframe_doc = iframe.contentDocument;
iframe_doc.open();
iframe_doc.write(source);
iframe_doc.close();
}
});
有谁知道如何让 CodeMirror 在这里工作?
此外,在 AngularJS 应用程序中使用 JQuery 事件侦听器真的是个坏主意吗?使用 AngularJS + CodeMirror 编写这个游乐场的最佳结构是什么?
编辑 1: 我发现 this thread, then I made a codeMirror directive,效果不佳。 DevTools 在 CodeMirror.fromTextArea(...)
.
TypeError: textarea.getAttribute is not a function
Here
我在 angularjs 添加了 Demo For Code 镜像。希望对您有所帮助...
您可以使用
解决OP的第二次尝试的响应
在指令的 link
函数中,您将 elem
参数用作纯 HTML 元素(这是 codemirror 所期望的),但 angular 将其提供为一个 JQLite 包装元素 - 所以基本上你只需要从它获取 HTML 元素并提供 it 给 codemirror,然后它就会工作:
var editor = CodeMirror.fromTextArea(elm[0], cm_opt);
(注意 elem[0]
而不是 elem
)
在 AngularJS 中,使用指令包装基于 JQuery 的逻辑来制作依赖于代码镜像等其他技术的组件并不是一个坏习惯。在某些情况下,您可以自己执行此操作,但也可以使用其他答案中提到的已经构建的第三方库。
无论您做什么,请确保通过使用指令和服务很好地封装非 angular 逻辑。
希望这对您有所帮助。