【问题标题】:Angular: binding click event to element after compilationAngular:编译后将点击事件绑定到元素
【发布时间】:2018-07-03 12:54:51
【问题描述】:

我正在使用 Angular 5 为学生开发一个应用程序,用户将能够看到一些文档,当用户进入文档内部时,将显示一组工具,其中一个工具是一个标记工具,允许用户在文档上标记文本,标记是持久的,因此保存在服务器上,并为文档上的每个标记设置和 id。文档的结构是这样的:

[{
        "chapterId": "254125",
        "title": "Some randome title",
        "blocks": [{
                "blockId": "12654654",
                "blockContent": {
                    "text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit harum ex fuga magni ea, fugiat rem voluptas odio alias, voluptates doloribus adipisci velit! Ullam, eveniet perferendis. Fugiat quis suscipit ipsa."
                }
            },
            {
                "blockId": "12654654",
                "blockContent": {
                    "text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit harum ex fuga magni ea, fugiat rem voluptas odio alias, voluptates doloribus adipisci velit! Ullam, eveniet perferendis. Fugiat quis suscipit ipsa."
                }
            },
            {
                "blockId": "12654654",
                "blockContent": {
                    "text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit harum ex fuga magni ea, fugiat rem voluptas odio alias, voluptates doloribus adipisci velit! Ullam, eveniet perferendis. Fugiat quis suscipit ipsa."
                }
            }
        ]
    },
    {
        "chapterId": "254125",
        "title": "Another randome title",
        "blocks": [{
                "blockId": "12654654",
                "blockContent": {
                    "text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit harum ex fuga magni ea, fugiat rem voluptas odio alias, voluptates doloribus adipisci velit! Ullam, eveniet perferendis. Fugiat quis suscipit ipsa."
                }
            },
            {
                "blockId": "12654654",
                "blockContent": {
                    "text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit harum ex fuga magni ea, fugiat rem voluptas odio alias, voluptates doloribus adipisci velit! Ullam, eveniet perferendis. Fugiat quis suscipit ipsa."
                }
            },
            {
                "blockId": "12654654",
                "blockContent": {
                    "text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit harum ex fuga magni ea, fugiat rem voluptas odio alias, voluptates doloribus adipisci velit! Ullam, eveniet perferendis. Fugiat quis suscipit ipsa."
                }
            }
        ]
    }
]

每个块是章节中的一个段落,循环章节和每个章节的块我自己构建文档(Document example),现在当我从服务器带回标记时,我得到这个对象:

{
  "id": 20,
  "start": 125,
  "end": 258,
  "color": "red",
  "chapterId": 12631561,
  "blockId": 121651
}

用这个我搜索正确的章节和正确的块,将标记放置在文本块的正确位置:

  public placeMarkerOnBlock(chapter, marker): any {
    let tempText: string = '';

    /* Here  we loop the blocks to find the righ
    *  one to place marker.
    */
    chapter.blocks.some((block) => {
      if (marker.blockId === block.blockId) {
        /*
        * Ones the block is founded i place the marker
        */
        const blockText = block.blockElement.text;
        this.counter(blockText, marker, counters);
        counters.endTags += counters.startTags;
        const start = marker.start + counters.startTags;
        const end = marker.end + counters.endTags;

        const textSelected = blockText.substring(start, end);
        tempText += block.blockElement.text.substring(0, start);
        tempText += `<mark class="${marker.color}" alt="${marker.id}">`;
        tempText += textSelected;
        tempText += '</mark>';
        tempText += block.blockElement.text.substring(end);

        block.blockElement.text = tempText;
        tempText = '';

        return false;
      }
    });
    return chapter;
  }

基本上我在这里做的是从块中获取文本并将其切割成 3 部分,标记之前的文本,标记之后的文本和标记中的文本,然后选择的文本我包裹在 @987654326 @ 标记并再次粘贴 3 部分,然后将文本替换为原始标记。

现在在所有这些解释之后,我需要做的是附加(绑定)到标记 (click)="" 事件,当用户单击文本中的一个标记时,显示一个带有按钮的小气泡删除那个被点击的标记Example of marker and bubble,但我没能做到,因为(click)=""事件基本上是在应用程序编译过程之后添加到标记中的,有没有其他方法可以实现这一点.. ..?

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    我想,您面临的问题是因为您试图在 HTML 上附加一个事件,该事件在运行时生成并且本质上是动态的。 因此,如果您使用的是 jquery,则可以通过以下方式在动态 HTML 上附加点击事件:-

     $(document).on("click", "a.remove" , function() {
            // write your logic here
        }); 
    

    其中“a.remove”:- a : 动态生成的锚标签, remove : 锚上的普通类。

    如果你不想使用 jquery 并且你想用 Angular 做所有事情,那么你可以在生命周期钩子中加载你的 HTML,即 ngOnInit() 并且当 HTML 完全加载时,你可以使用 ngAfterViewInit() 来在动态生成的 HTML 上创建点击事件。

     ngAfterViewInit(): void {
    
     // write logic to add click event on generated html
    }
    
     ngOnInit() {
        //load your data here
    }
    

    【讨论】:

    • 点击事件不会附加到气泡上,而是附加到标记为 &lt;mark&gt;Selected text&lt;/mark&gt; 的文本上,此解决方案的另一个问题是用户在使用时将在文档中创建新标记文档,所以在这种情况下,我将无法将事件绑定到新标记。
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2016-07-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多