feat:Add InconsistProperty decorator because sometimes the property in js side cannot be consist with natiive side

This commit is contained in:
pengfei.zhou
2021-03-03 10:08:48 +08:00
committed by osborn
parent d13948223e
commit 28519d20c7
11 changed files with 80 additions and 13 deletions

View File

@@ -37,6 +37,19 @@ export function Property(target: View, propKey: string) {
})
}
export function InconsistProperty(target: Object, propKey: string) {
Object.defineProperty(target, propKey, {
get: function () {
return Reflect.get(this, `__prop__${propKey}`, this)
},
set: function (v) {
const oldV = Reflect.get(this, `__prop__${propKey}`, this)
Reflect.set(this, `__prop__${propKey}`, v, this)
Reflect.apply(this.onPropertyChanged, this, [propKey, oldV, v])
},
})
}
export type NativeViewModel = {
id: string;
type: string;

View File

@@ -22,8 +22,15 @@ import { LayoutConfig } from '../util/layoutconfig'
import { IAnimation } from "./animation";
import { FlexConfig } from "../util/flexbox";
const PROP_CONSIST = 1;
const PROP_INCONSIST = 2;
export function Property(target: Object, propKey: string) {
Reflect.defineMetadata(propKey, true, target)
Reflect.defineMetadata(propKey, PROP_CONSIST, target)
}
export function InconsistProperty(target: Object, propKey: string) {
Reflect.defineMetadata(propKey, PROP_INCONSIST, target)
}
export type NativeViewModel = {
@@ -118,7 +125,9 @@ export abstract class View implements Modeling {
set: (target, p, v, receiver) => {
const oldV = Reflect.get(target, p, receiver)
const ret = Reflect.set(target, p, v, receiver)
if (Reflect.getMetadata(p, target) && oldV !== v) {
if (Reflect.getMetadata(p, target) === PROP_CONSIST && oldV !== v) {
receiver.onPropertyChanged(p.toString(), oldV, v)
} else if (Reflect.getMetadata(p, target) === PROP_INCONSIST) {
receiver.onPropertyChanged(p.toString(), oldV, v)
}
return ret

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { View, Property } from "../ui/view";
import { View, Property, InconsistProperty } from "../ui/view";
import { Color } from "../util/color";
import { Gravity } from "../util/gravity";
import { BridgeContext } from "../runtime/global";
@@ -21,7 +21,7 @@ import { layoutConfig } from "../util/index.util";
export class Input extends View {
@Property
@InconsistProperty
text?: string
@Property
@@ -53,7 +53,7 @@ export class Input extends View {
@Property
maxLength?: number
@Property
password?: boolean

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { View, Property } from "../ui/view";
import { View, Property, InconsistProperty } from "../ui/view";
import { Color } from "../util/color";
import { layoutConfig } from "../util/index.util";
@@ -21,7 +21,7 @@ export class Switch extends View {
/**
* True is on ,false is off,defalut is off.
*/
@Property
@InconsistProperty
state?: boolean
/**
* Switch change callback