add view response callback

This commit is contained in:
pengfei.zhou 2019-07-18 13:13:19 +08:00
parent e6bc920ab7
commit b06e31fac6
4 changed files with 42 additions and 15 deletions

View File

@ -1,4 +1,5 @@
import { uniqueId } from "../util/uniqueId"; import { uniqueId } from "../util/uniqueId";
import { loge } from "../util/log";
/** /**
* ``` TypeScript * ``` TypeScript
@ -27,19 +28,6 @@ declare function nativeRequire(moduleName: string): boolean
declare function nativeBridge(contextId: string, namespace: string, method: string, args?: any, callbackId?: string): boolean declare function nativeBridge(contextId: string, namespace: string, method: string, args?: any, callbackId?: string): boolean
export function log(message: any) {
console.log(message)
}
export function loge(message: any) {
console.error(message)
}
export function logw(message: any) {
console.warn(message)
}
export function jsCallResolve(contextId: string, callbackId: string, args?: any) { export function jsCallResolve(contextId: string, callbackId: string, args?: any) {
const context = gContexts.get(contextId) const context = gContexts.get(contextId)
if (context === undefined) { if (context === undefined) {

View File

@ -43,7 +43,7 @@ export abstract class Panel {
return this.build() return this.build()
} }
private __responed__(viewId: string, action: string, args: any) { private __responedCallback__(viewId: string, callbackId: string) {
} }
} }

View File

@ -2,6 +2,7 @@ import { Color, GradientColor } from "../util/color"
import { Modeling, Model } from "../util/types"; import { Modeling, Model } from "../util/types";
import "reflect-metadata" import "reflect-metadata"
import { uniqueId } from "../util/uniqueId"; import { uniqueId } from "../util/uniqueId";
import { loge } from "../util/log";
export function Property(target: Object, propKey: string) { export function Property(target: Object, propKey: string) {
Reflect.defineMetadata(propKey, true, target) Reflect.defineMetadata(propKey, true, target)
@ -41,6 +42,19 @@ export abstract class View implements Modeling {
@Property @Property
viewId = uniqueId('ViewId') viewId = uniqueId('ViewId')
callbacks: Map<String, Function> = new Map
private callback2Id(f: Function) {
const id = uniqueId('Function')
this.callbacks.set(id, f)
return id
}
private id2Callback(id: string) {
const f = this.callbacks.get(id)
return f
}
constructor() { constructor() {
return new Proxy(this, { return new Proxy(this, {
get: (target, p) => { get: (target, p) => {
@ -91,7 +105,9 @@ export abstract class View implements Modeling {
__dirty_props__: { [index: string]: Model | undefined } = {} __dirty_props__: { [index: string]: Model | undefined } = {}
onPropertyChanged(propKey: string, oldV: Model, newV: Model): void { onPropertyChanged(propKey: string, oldV: Model, newV: Model): void {
if (newV instanceof Object if (newV instanceof Function) {
newV = this.callback2Id(newV)
} else if (newV instanceof Object
&& Reflect.has(newV, 'toModel') && Reflect.has(newV, 'toModel')
&& Reflect.get(newV, 'toModel') instanceof Function) { && Reflect.get(newV, 'toModel') instanceof Function) {
newV = Reflect.apply(Reflect.get(newV, 'toModel'), newV, []) newV = Reflect.apply(Reflect.get(newV, 'toModel'), newV, [])
@ -99,6 +115,18 @@ export abstract class View implements Modeling {
this.__dirty_props__[propKey] = newV this.__dirty_props__[propKey] = newV
} }
responseCallback(id: string) {
const f = this.id2Callback(id)
if (f instanceof Function) {
const argumentsList: any = []
for (let i = 1; i < arguments.length; i++) {
argumentsList.push(arguments[i])
}
Reflect.apply(f, this, argumentsList)
} else {
loge(`Cannot find callback:${id} for ${JSON.stringify(this.toModel())}`)
}
}
toModel() { toModel() {
return { return {
id: this.viewId, id: this.viewId,

View File

@ -0,0 +1,11 @@
export function log(message: any) {
console.log(message)
}
export function loge(message: any) {
console.error(message)
}
export function logw(message: any) {
console.warn(message)
}