【问题标题】:Can I use a JavaScript inline edit library in my Angular 2 project?我可以在我的 Angular 2 项目中使用 JavaScript 内联编辑库吗?
【发布时间】:2017-05-24 06:07:53
【问题描述】:

这是图书馆:

http://www.jqueryscript.net/demo/jQuery-jQuery-UI-Based-Content-editable-Widget-contenteditable-js/

这用于在 html 页面上进行内联编辑。我在 HTML 页面上的代码如下所示 -

<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
    <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
    <script src="http://sco7.com/del/jquery-contenteditable.js"></script>
    <script>
        $("#basic").editable();
        $("#paragraph").editable({
            multiline: true,
            autoselect: true
        });
        $("#alert").editable({
            multiline: true,
            saveDelay: 800,
            save: function(e, ui) {
                alert("Saving actual content: " + ui.content);
            }
        });
        $("#scalable").editable({
            multiline: true
        });
        $("#nonempty").editable({
            multiline: true,
            saveDelay: 600,
            autoselect: true,
            save: function(e, ui) {
                alert("Saving actual content: " + ui.content);
            },
            validate: function(e, ui) {
                return ui.content !== "";
            }
        });
        $("#complex").editable({
            content: "a", //only link <a> is editable
            autoselect: true,
            save: function(e, ui) {
                alert("New link: " + ui.content);
            },
            validate: function(e, ui) {
                return ui.content !== ""
            }
        });
    </script>
<p id="alert">
        This sample fires alert each time changed content is supposed to be saved (e.g. sent to server).
        It is currently set up to fire after 800ms delay of not typing anything.
    </p>

我想在我的 Angular 项目中使用它。我可以按原样使用它吗?像&lt;p id="alert"&gt; 一样,我是否需要以类似的方式执行此操作?

【问题讨论】:

  • 为什么要使用库进行内联编辑。为什么不使用默认浏览器功能?
  • 我正在创建一个 html 编辑器,与内联编辑相反的是什么?

标签: javascript jquery html angularjs


【解决方案1】:

您可以在 html 元素上使用contenteditable 属性或设置designmode 以使其可编辑。更多信息可以参考Mozilla Developer Network

$(document).ready(function(){
  $("#alert").keyup(function(){
    console.info($(this).html()); // prints edited text
    console.info("Inner Html---->"+$("#container").html()); // prints html of edited text
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
   <div id="container">
<p id="alert" contenteditable="true">
 EDIT ME
</p>
</div>

示例代码

<div #container>
 <p #alert contenteditable="true">EDIT ME</p>
</div>

脚本文件

import {ElementRef,Renderer2} from '@angular/core';
@ViewChild('container') el:ElementRef;

constructor(private rd: Renderer2) {}

ngAfterViewInit() {
  this.el.nativeElement.innerHtml;      
}

【讨论】:

  • 在edit.component.ts中我可以编辑EDIT ME,但是在angular2中,我如何获取&lt;div id="container"&gt;中的html内容
  • 添加了一个示例代码。如果这不能解决您的问题,请使用PlunkerJSFiddle @user2828442 分享您的工作代码
  • @ViewChild('container') el:ElementRef; 它说 [ts] 未使用的标签
【解决方案2】:

选项 1:直接添加脚本

您可以使用$("selector")直接在您的页面中添加该脚本

index.html

<h2 id="basic">
    Basic examples. Click on me to edit. Press 'ESC' or 'Tab' or click anywhere else to finish editing.
</h2>

<!--do not forget add scripts-->

<!--basic scripts-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
<script src="http://www.jqueryscript.net/demo/jQuery-jQuery-UI-Based-Content-editable-Widget-contenteditable-js/src/jquery-contenteditable.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.3/angular.js"></script>

<!--your scripts-->
<script src="app.js"></script>
<script src="your-editable.js"></script>

app.js

var app = angular.module("app", []);

your-editable.js

$("#basic").editable();

选项 2:转换为指令

您可以在此处将可编辑转换为指令以对元素有更多访问权限

index.html

 <!--options: basic, paragraph, alert, scalable, nonempty, complex-->
<h2 content="basic">
    Basic examples. Click on me to edit. Press 'ESC' or 'Tab' or click anywhere else to finish editing.
</h2>

<!--do not forget add scripts-->

<!--basic scripts-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
<script src="http://www.jqueryscript.net/demo/jQuery-jQuery-UI-Based-Content-editable-Widget-contenteditable-js/src/jquery-contenteditable.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.3/angular.js"></script>

<!--your scripts-->
<script src="app.js"></script>
<script src="directive.js"></script>

app.js

var app = angular.module("app", []);

directive.js

您还可以改进此指令以从开发人员那里获得更多选择

app.directive("content", function () {
  return {
     restrict: "A",
     scope: {
        content: "@"
     },
     link: function ($scope, $element) {
       switch ($scope.content) {
         case "basic":
           $element.editable();
         break;
         case "paragraph":
           $element.editable({
             multiline: true,
             autoselect: true
            });
         break;
         case "alert":
            $element.editable({
              multiline: true,
              saveDelay: 800,
              save: function (content) {
                alert("Saving actual content: " + content);
              }
         });
         break;
         case "scalable":
           $element.editable({
             multiline: true
           });
         break;
         case "nonempty":
           $element.editable({
              multiline: true,
              saveDelay: 600,
              autoselect: true,
              save: function (content) {
                 alert("Saving actual content: " + content);
              },
              validate: function (content) {
                 return content !== "";
              }});
          break;
          case "complex":
            $element.editable({
               content: "a",
               autoselect: true,
               save: function (content) {
                  alert("New link: " + content);
               },
               validate: function (content) {
                  return content !== "";
               }});
         break;
         default:
              $element.editable();
         }}}});

【讨论】:

  • 以上解决方案是针对 anguar2 的?因为我是 Angular 的新手,所以我发现如果我创建 1 个组件,那么它各自的 .ts 文件也会随之生成,这个 app.js 的基本原理对我来说并不清楚,例如我使用 cli ng g c exportexample 创建了一个组件,它创建 export-example.component.htmlexport-example.component.ts 。我也不清楚angular.module("app", []);,请指导我学习这些基础知识的正确路径
  • 你在哪里说与 angular 2 相关的问题?你用的是哪个版本!
  • 很抱歉我没有提到,我在 angular2
  • 当您创建一个新组件 angular-cli 时,它将创建 (.html),(.ts),(.spec.ts) 并且您的新组件将作为 import 语句包含在 app.module.ts 文件中。如果你不打算写测试,.spec.ts 可以避免。
猜你喜欢
  • 2013-08-07
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2013-10-30
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多