2016-12-15 20 views
0

Nativescriptのイベント処理とちょっと混乱します。私はコードビハインドとビューモデルの明確な分離でtypescriptを使用していますが、私はviewmodelメソッドにitemTapプロパティをバインドしようとしています(https://github.com/NativeScript/template-hello-world-ts/blob/master/main-view-model.tsの例のように)。NativescriptでViewModel mathodにitemTapをバインドする

XML:

<Page xmlns="http://schemas.nativescript.org/tns.xsd" navigatingTo="navigatingTo" loaded="pageLoaded" class="page"> 
    <StackLayout> 
    <ListView items="{{ items }}" itemTap="onItemTapped"> 
     <ListView.itemTemplate> 
     <Label text="{{ Name }}"/> 
     </ListView.itemTemplate> 
    </ListView> 
    </StackLayout> 
</Page> 

コードビハインド:

import { EventData } from 'data/observable'; 
import { Page } from 'ui/page'; 
import { EditItemViewModel } from '../../ViewModels/EditItemViewModel'; 

export function navigatingTo(args: EventData) { 
    let page = <Page>args.object; 
    page.bindingContext = new EditItemViewModel(); 
} 

のViewModel:

import { Observable } from 'data/observable'; 
import { ObjectRelationalMapper } from '../Common/Data' 
import { WebServiceDataManager } from '../Common/Data' 

import { Item } from '../Models/Item'; 

export class EditItemViewModel extends Observable { 
    _wsDataManager: WebServiceDataManager; 
    _orm: ObjectRelationalMapper; 
    _items: Array<Item>; 

    get items(): Array<Item> { 
    return this._items; 
    } 

    set items(items: Array<Item>) { 
    this._items = items; 
    } 

    constructor() { 
    super(); 
    this._wsDataManager = new WebServiceDataManager(); 
    this._orm = new ObjectRelationalMapper(); 
    this.listAllItems(); 
    } 

    private listAllItems(): void { 
    this._orm.getAllObjects(Item, this, this.onItemsReceived) 
    } 

    public onItemsReceived(items: Array<Item>) { 
    this._items = items; 
    this.notify({ object: this, eventName: Observable.propertyChangeEvent, propertyName: 'items', value: this._items }); 
    } 

    public onItemTapped(args): void { 
    let tappedView: any = args.view; 
    let tappedItem: Item = tappedView.bindingContext; 
    } 
} 

そしてonItemTapped方法解雇されません。コードビハインドでonItemTappedを置いた場合:

export function onItemTapped(args): void { 
    let tappedView: any = args.view; 
    let tappedItem: any = tappedView.bindingContext; 
} 

..期待どおりに動作します。 viewModelでイベントハンドラを使用したときに何が問題になったのですか?また、helloworldの例が誤解を招くような理由は何ですか?

答えて

4

事は、あなたが二重の波括弧を使用してビューモデルのプロパティにアイテム意味を参照しているだけのようにそれを参照する必要がありますのでをonItemTappedあなたの最初のケースでは、あなたのビューモデルから来ているということです:機能をonItemTapped場合は今

<ListView items="{{ items }}" itemTap="{{ onItemTapped }}"> 

は、ファイルの後ろにあなたのコードの中に配置されて、あなたのコードで書かれたとして、あなたはそれを直接参照することができ

<ListView items="{{ items }}" itemTap="onItemTapped"> 
関連する問題