TypeScript List Item Event Bind to ViewModel's Function(TypeScript 列表子项点击事件绑定ViewModel的函数)

之前建了个TypeScript MVVM的App,希望在点击列表中的子项的链接可以触发显示该子项的详细信息,于是在html页添加了如下代码,

            <div class="panel-body">
                <ul class="list-unstyled" data-bind="foreach: books">
                    <li>
                        <strong><span data-bind="text: AuthorName" class="span-body"></span></strong>:
                        <small>
                            <a href="#" class="span-body"
                               data-bind="text: Title, click: $parent.getBookDetail"></a>
                        </small>
                    </li>
                </ul>
            </div>

在其对应的ViewModel中也添加相应的方法,并在this.bookService.处打上断点。

        /**
         * Get book details.
         *
         * @param item A book object detail.
         */
        public getBookDetail(item: WebApiClient.Models.Datas.Book): void {
            this.bookService.getItem(item.Id).done((data) => {
                this.detail(data);
            });
        }
运行后效果如下图



点击Books栏的链接,例如Book A,到达断点处

可以看到此时的this并不是我们期望的viewModel对象而是该Book对象,继续运行,程序奔溃并退出。因为在JavaScript中,this指向函数执行时的当前对象,作为JavaScript超集的TypeScript亦是如此,所以我们需要修改列表子项的事件绑定,使this能够正确的指向viewModel.

这里我们需要把click: $parent.getBookDetail改为event: { click: $root.getBookDetail.bind($root) },问题就迎刃而解了。

            <div class="panel-body">
                <ul class="list-unstyled" data-bind="foreach: books">
                    <li>
                        <strong><span data-bind="text: AuthorName" class="span-body"></span></strong>:
                        <small>
                            <a href="#" class="span-body"
                               data-bind="text: Title, event: { click: $root.getBookDetail.bind($root) }"></a>
                        </small>
                    </li>
                </ul>
            </div>
最后运行再次点击book A,到达断点处,


这个时候this指向了当前的viewModel,继续运行,程序也OK了。



相关资源和代码下载:http://download.csdn.net/detail/leyyang/8016567

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值