List view attaches with weakEventHandler

This commit is contained in:
vakrilov
2015-05-11 15:31:04 +03:00
parent 727145caeb
commit fd9ff189ba
3 changed files with 41 additions and 18 deletions

View File

@@ -33,7 +33,7 @@ declare module "ui/core/weak-event-listener" {
/** /**
* A string to use as key for key value pair instance. * A string to use as key for key value pair instance.
*/ */
key?: string; key: string;
} }
/** /**

View File

@@ -1,4 +1,5 @@
import observable = require("data/observable"); import observable = require("data/observable");
import observableArray = require("data/observable-array");
import view = require("ui/core/view"); import view = require("ui/core/view");
import proxy = require("ui/core/proxy"); import proxy = require("ui/core/proxy");
import definition = require("ui/list-view"); import definition = require("ui/list-view");
@@ -6,32 +7,22 @@ import dependencyObservable = require("ui/core/dependency-observable");
import builder = require("ui/builder"); import builder = require("ui/builder");
import label = require("ui/label"); import label = require("ui/label");
import color = require("color"); import color = require("color");
import weakEventListener = require("ui/core/weak-event-listener");
var ITEMS = "items"; var ITEMS = "items";
var ITEMTEMPLATE = "itemTemplate"; var ITEMTEMPLATE = "itemTemplate";
var ISSCROLLING = "isScrolling"; var ISSCROLLING = "isScrolling";
var LISTVIEW = "ListView"; var LISTVIEW = "ListView";
var ITEMSCHANGED = "_itemsChanged";
var CHANGE = "change";
var SEPARATORCOLOR = "separatorColor"; var SEPARATORCOLOR = "separatorColor";
var WEAKEVENTKEY = "_observableArrayChanged";
export module knownTemplates { export module knownTemplates {
export var itemTemplate = "itemTemplate"; export var itemTemplate = "itemTemplate";
} }
function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) { function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var listView = <definition.ListView>data.object; var listView = <ListView>data.object;
var itemsChanged = listView[ITEMSCHANGED]; listView._onItemsPropertyChanged(data);
if (data.oldValue instanceof observable.Observable) {
(<observable.Observable>data.oldValue).off(CHANGE, itemsChanged);
}
if (data.newValue instanceof observable.Observable) {
(<observable.Observable>data.newValue).on(CHANGE, itemsChanged);
}
listView.refresh();
} }
function onItemTemplatePropertyChanged(data: dependencyObservable.PropertyChangeData) { function onItemTemplatePropertyChanged(data: dependencyObservable.PropertyChangeData) {
@@ -79,6 +70,7 @@ export class ListView extends view.View implements definition.ListView {
); );
private _itemsChanged: (args: observable.EventData) => void; private _itemsChanged: (args: observable.EventData) => void;
private _weakEventListenerOptions: weakEventListener.WeakEventListenerOptions;
constructor() { constructor() {
super(); super();
@@ -143,6 +135,28 @@ export class ListView extends view.View implements definition.ListView {
lbl.text = this._getDataItem(index) + ""; lbl.text = this._getDataItem(index) + "";
return lbl; return lbl;
} }
public _onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
if (data.oldValue instanceof observable.Observable && this._weakEventListenerOptions) {
weakEventListener.WeakEventListener.removeWeakEventListener(this._weakEventListenerOptions);
this._weakEventListenerOptions = null;
}
if (data.newValue instanceof observable.Observable) {
this._weakEventListenerOptions = {
targetWeakRef: new WeakRef(this),
sourceWeakRef: new WeakRef(data.newValue),
eventName: observableArray.ObservableArray.changeEvent,
handler: this._itemsChanged,
handlerContext: this,
key: WEAKEVENTKEY
};
weakEventListener.WeakEventListener.addWeakEventListener(this._weakEventListenerOptions);
}
this.refresh();
}
} }
function getExports(instance: view.View): any { function getExports(instance: view.View): any {

View File

@@ -151,6 +151,7 @@ export class ListView extends common.ListView {
private _delegate; private _delegate;
private _heights: Array<number>; private _heights: Array<number>;
private _preparingCell: boolean = false; private _preparingCell: boolean = false;
private _isDataDirty: boolean = false;
constructor() { constructor() {
super(); super();
@@ -172,6 +173,9 @@ export class ListView extends common.ListView {
public onLoaded() { public onLoaded() {
super.onLoaded(); super.onLoaded();
if (this._isDataDirty) {
this.refresh();
}
this._ios.delegate = this._delegate; this._ios.delegate = this._delegate;
} }
@@ -185,8 +189,13 @@ export class ListView extends common.ListView {
} }
public refresh() { public refresh() {
this._ios.reloadData(); if (this.isLoaded) {
this.requestLayout(); this._ios.reloadData();
this.requestLayout();
this._isDataDirty = false;
} else {
this._isDataDirty = true;
}
} }
public getHeight(index: number): number { public getHeight(index: number): number {
@@ -242,7 +251,7 @@ export class ListView extends common.ListView {
cell.contentView.addSubview(view.ios); cell.contentView.addSubview(view.ios);
this._addView(view); this._addView(view);
} }
this._prepareItem(view, indexPath.row); this._prepareItem(view, indexPath.row);
cellHeight = this._layoutCell(view, indexPath); cellHeight = this._layoutCell(view, indexPath);
} }