mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 11:42:04 +08:00
List view attaches with weakEventHandler
This commit is contained in:
2
ui/core/weak-event-listener.d.ts
vendored
2
ui/core/weak-event-listener.d.ts
vendored
@ -33,7 +33,7 @@ declare module "ui/core/weak-event-listener" {
|
||||
/**
|
||||
* A string to use as key for key value pair instance.
|
||||
*/
|
||||
key?: string;
|
||||
key: string;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,4 +1,5 @@
|
||||
import observable = require("data/observable");
|
||||
import observableArray = require("data/observable-array");
|
||||
import view = require("ui/core/view");
|
||||
import proxy = require("ui/core/proxy");
|
||||
import definition = require("ui/list-view");
|
||||
@ -6,32 +7,22 @@ import dependencyObservable = require("ui/core/dependency-observable");
|
||||
import builder = require("ui/builder");
|
||||
import label = require("ui/label");
|
||||
import color = require("color");
|
||||
import weakEventListener = require("ui/core/weak-event-listener");
|
||||
|
||||
var ITEMS = "items";
|
||||
var ITEMTEMPLATE = "itemTemplate";
|
||||
var ISSCROLLING = "isScrolling";
|
||||
var LISTVIEW = "ListView";
|
||||
var ITEMSCHANGED = "_itemsChanged";
|
||||
var CHANGE = "change";
|
||||
var SEPARATORCOLOR = "separatorColor";
|
||||
var WEAKEVENTKEY = "_observableArrayChanged";
|
||||
|
||||
export module knownTemplates {
|
||||
export var itemTemplate = "itemTemplate";
|
||||
}
|
||||
|
||||
function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
|
||||
var listView = <definition.ListView>data.object;
|
||||
var itemsChanged = listView[ITEMSCHANGED];
|
||||
|
||||
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();
|
||||
var listView = <ListView>data.object;
|
||||
listView._onItemsPropertyChanged(data);
|
||||
}
|
||||
|
||||
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 _weakEventListenerOptions: weakEventListener.WeakEventListenerOptions;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
@ -143,6 +135,28 @@ export class ListView extends view.View implements definition.ListView {
|
||||
lbl.text = this._getDataItem(index) + "";
|
||||
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 {
|
||||
|
@ -151,6 +151,7 @@ export class ListView extends common.ListView {
|
||||
private _delegate;
|
||||
private _heights: Array<number>;
|
||||
private _preparingCell: boolean = false;
|
||||
private _isDataDirty: boolean = false;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
@ -172,6 +173,9 @@ export class ListView extends common.ListView {
|
||||
|
||||
public onLoaded() {
|
||||
super.onLoaded();
|
||||
if (this._isDataDirty) {
|
||||
this.refresh();
|
||||
}
|
||||
this._ios.delegate = this._delegate;
|
||||
}
|
||||
|
||||
@ -185,8 +189,13 @@ export class ListView extends common.ListView {
|
||||
}
|
||||
|
||||
public refresh() {
|
||||
this._ios.reloadData();
|
||||
this.requestLayout();
|
||||
if (this.isLoaded) {
|
||||
this._ios.reloadData();
|
||||
this.requestLayout();
|
||||
this._isDataDirty = false;
|
||||
} else {
|
||||
this._isDataDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
public getHeight(index: number): number {
|
||||
@ -242,7 +251,7 @@ export class ListView extends common.ListView {
|
||||
cell.contentView.addSubview(view.ios);
|
||||
this._addView(view);
|
||||
}
|
||||
|
||||
|
||||
this._prepareItem(view, indexPath.row);
|
||||
cellHeight = this._layoutCell(view, indexPath);
|
||||
}
|
||||
|
Reference in New Issue
Block a user