Vik*_*iaR 8 knockout.js typescript
码:
export class ViewModel {
public users: knockout.koObservableArrayBase;
constructor () {
this.users = ko.observableArray([]);
this.removeUser = this.removeUser.bind(this);//<-- Here compiller shows error
}
removeUser(user: User): void {
this.users.remove(user);
}
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<table>
<thead>
<tr>
<th>Name</th>
<th>Surname</th>
</tr>
</thead>
<tbody data-bind="foreach: users">
<tr>
<td><a href="#" data-bind="click: $root.removeUser">Remove</a></td>
<td data-bind="text: name"></td>
<td data-bind="text: surname"></td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
问题出在removeUser方法中.默认情况下,如果我没有绑定上下文,这= = UserToDelete - 而不是viewModel对象.如果我添加到构造函数:this.removeUser = this.removeUser.bind(this); (manually enforce context),那么上下文就是这个== viewmodel,但是然后TypeScript抱怨"无法将函数转换为(user:User)=> void需要一个调用签名,但是Function缺少一个."
我不熟悉KO所以也许有更好的方式来解决上下文切换,但您的打字稿编译器错误是由"绑定"返回式"功能",这是与"removeUser"的类型不兼容引起的.您应该能够通过将返回的函数转换为原始类型签名来解决此问题,如下所示:
this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Run Code Online (Sandbox Code Playgroud)