bind view action and model

This commit is contained in:
pengfei.zhou 2019-07-24 17:24:00 +08:00
parent 43fd9fedd1
commit 69f424f013
2 changed files with 16 additions and 9 deletions

View File

@ -1,8 +1,7 @@
import { VMPanel, View, ViewModel, WRAP_CONTENT, Gravity, Mutable, NativeCall, Text, Color, VLayout, Panel, log, logw, loge, Group, Stack, } from "./index"
import { CENTER } from "./src/util/gravity";
interface CountModel {
count: number
add: () => void
}
class CounterVM extends ViewModel<CountModel> {
@ -23,26 +22,29 @@ class CounterVM extends ViewModel<CountModel> {
}
vlayout.addChild(number)
vlayout.addChild(counter)
root.addChild(vlayout)
this.bind((data) => {
loge('bind:', data)
number.text = data.count.toString()
loge(`data changed:${data.count},${vlayout.isDirty()}`)
counter.onClick = data.add
})
counter.onClick = () => {
model.count++
loge('onclick', model.count)
}
}
}
@Entry
class MyPage extends VMPanel<CountModel>{
createVM(): ViewModel<CountModel> {
return new CounterVM({ count: 0 })
return new CounterVM({
count: 0,
add: function () {
this.count++
}
})
}
@NativeCall

View File

@ -1,12 +1,17 @@
import { View, Group } from "../ui/view";
import { Panel } from "../ui/panel";
import { loge } from "../util/log";
function listen<T extends Object>(obj: T, listener: Function): T {
return new Proxy(obj, {
get: (target, prop, receiver) => {
const ret = Reflect.get(target, prop, receiver)
if (ret instanceof Object) {
if (ret instanceof Function) {
return () => {
return Reflect.apply(ret, receiver, arguments)
}
} else if (ret instanceof Object) {
return listen(ret, listener)
} else {
return ret