【问题标题】:Call typescript function from onclick从 onclick 调用 typescript 函数
【发布时间】:2017-09-06 23:35:03
【问题描述】:

我创建了一个 SharePoint 框架 Webpart。

我调用一个 web 服务,它从 sharepoint(来自 termstore 的术语)返回一些数据,并为每个术语生成一个显示该术语的 html。在每个术语的 onclick 上,我想调用一个打字稿函数,将术语作为参数传递,以获取其子术语。

下面的这段代码创建了以下错误行为:当 webpart 显示时,当我什至没有点击它时,它会自动调用函数 this.readIterm !

我是否遗漏了什么或设计做错了?我试图用 onclick="readIterm($(term))" 替换 onclick="${this.readIterm(term)}" 但它什么也没做。

代码如下

terms.forEach(term => {
              htmlContent +=
                `<div class="w3-card w3-third w3-margin-bottom" style="" onclick="${this.readIterm(term)}">
                      <header class="w3-container w3-blue">
                        <h1>Header</h1>
                      </header>
                    <div class="w3-container">
                      <span>${term.name}</p>
                    </div>
                    <footer class="w3-container w3-blue">
                      <h5>Footer</h5>
                    </footer>
                    </div>`

然后将此 html 添加到 this.domElement.innerHTML 中,并在 webpart 中显示它。

public readIterm(myTerm: ITerm) { alert("readIterm is clicked"); }

如果我不遵循最佳做法,请提前感谢您的帮助和指导!

杰夫

【问题讨论】:

    标签: sharepoint-2013 sharepoint-online spfx


    【解决方案1】:

    还有另一种附加事件侦听器的方法。

    请参阅下面的代码示例。这对我来说非常有效: (注意:这是一个基本的想法。您可以参考此代码并相应地更改您的代码。)

    public render(): void{ 
    
    this.domElement.innerHTML = ` <div class="form-group">
       <button class="btn btn-success" id="btnReadAllItems">
          <span class="ms-Button-label">Read All Items</span>
       </button>
       <button class="btn btn-success" id="btnReadItemById">
          <span class="ms-Button-label">Read Item By Id</span>
       </button>
    </div>`; 
    this._setButtonEventHandlers(); 
    
    }
    
    
    
    private _setButtonEventHandlers(): void {
       const webPart: SpfxCrudWebPart = this;
       this.domElement.querySelector('#btnReadAllItems').addEventListener('click', () => {
          this._GetListItemsNF();
       });
    }
    
    
    private _GetListItemsNF(): void {
       // 
       //
       //
    }
    

    另一种方法如下。 (但您必须根据您的代码进行一些更改)

    public render(): void{ 
          htmlContent +=
            `<div class="w3-card w3-third w3-margin-bottom" id="test">
                  <header class="w3-container w3-blue">
                    <h1>Header</h1>
                  </header>
                <div class="w3-container">
                  <span>${term.name}</p>
                </div>
                <footer class="w3-container w3-blue">
                  <h5>Footer</h5>
                </footer>
            </div>`
        }
    
        this._setButtonEventHandlers(); 
    
        this.myTerm = term;  // Here we are assigning value to the `myTerm` variable. And `myTerm` is a public property, So value of `myTerm` will be accessible using `this.myTerm`
    }
    
    
    public myTerm: ITerm; // here we are declaring `myTerm` variable
    
    public readIterm():void{
    
        // here you can access the cariable `myTerm` using `this.myTerm`.
    
        // alert(this.myTerm);
    
        // alert("readIterm is clicked"); 
    
    }
    
    private _setButtonEventHandlers(): void {
       this.domElement.querySelector('#test').addEventListener('click', () => { this.readIterm(); });
    }
    

    【讨论】:

    • 我无法让它与您的解决方案一起使用,因为我从术语库获取术语,对于每个术语我都会生成一个 HTML 来显示它。单击该术语时,我需要传递所选术语,这就是为什么我想这样做: onclick="${this.readIterm(term)}"> 也许这不是一个好习惯。谢谢你的时间:)
    • 请参考上述答案。我已经更新并添加了另一种方法。你可以试试这个方法。
    • 您好,感谢您的帮助,我想我可以填充一个术语对象数组,然后迭代这些对象(我的术语),然后调用 onclick 并将对象作为参数传递。我不知道这是否是好的设计。也许 react 对此有帮助?
    【解决方案2】:

    使用 onClick 而不是 onclick。然后检查以确保通过调用控制台 (console.log) 进入您的“readIterm”方法。

    【讨论】:

    • 它按照定义的代码进入 readIterms。但甚至没有点击。每次显示一个术语时它都会进入;
    • 但是你的方法从何而来?它包含在您的模块中吗?还是进口的?如果你的方法是导入的,那么直接在那里调用它(例如{maMethode()},不需要这个)。否则,如果它是在您的模块的参数中传递的,那么在调用它之前在本地声明它。希望能有所帮助。
    • 方法在同一个TS文件中
    • public readIterm(myTerm: ITerm) { alert("readIterm 被点击"); }
    • 如果你想通过点击来执行动作,那么你必须在你的模块中声明将它附加到事件的方法(例如: const readIterm_ = event => () {readIterm () })。除非您将方法显式传递给模块,否则我看不出如何从模块中调用服务器方法(知道模块的上下文在 {} 中进行了分区)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-02-11
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多