2016-11-19 55 views
0

我使用MaterializeCSS's autocompleteAngular2-Materialize,我试图将选定的值推入一个数组。不过,我发现了以下错误:推入数组不工作的jQuery功能内

Cannot read property 'push' of undefined

这里是我的组件:

public items: any[] = []; 

addItem() { 
    $('.autocomplete-content').on('click', 'li', function() { 
    let value = $(this).text().trim(); 
    this.items.push({ [value]: true }); 
    }); 
} 

如果我尝试pushjQuery功能以外的一些随意的事情,它的工作原理。

这里是我的HTML:

<input type="text" (change)="addItem()" materialize="autocomplete" [materializeParams]="[{'data': myData | async}]"> 
+0

是JavaScript的?我承认我没有及时更新我的​​ES6 – thedarklord47

+0

它是带有Typescript的Angular2。 – brians69

+0

可能想标记它的打字稿,然后 – thedarklord47

回答

3

this在你的函数是指点击的元素,不是你的类范围。因此,无论使用

$('.autocomplete-content').on('click', 'li', ev => { 
    let value = $(ev.target).text().trim(); 
    this.items.push({ [value]: true }); 
    }); 

或者bind(this)使课堂这个可供click处理

$('.autocomplete-content').on('click', 'li', function (ev) { 
    let value = $(ev.target).text().trim(); 
    this.items.push({ [value]: true }); 
    }.bind(this)); 

注意改变$(this)你可以传递给函数的元素。

你也可以定义addItem()that并使用它......

addItem() { 
    var that = this; 
    $('.autocomplete-content').on('click', 'li', function() { 
    let value = $(this).text().trim(); 
    that.items.push({ [value]: true }); 
    }); 
} 
+0

但是不会破坏'$(this).text()'? – nnnnnn

+0

谢谢@nnnnnn - 在答案后看到它...... – baao

+0

事件处理程序的第一个参数是'event'对象,而不是元素。但你可以使用'event.target' – nnnnnn