Observable 기본 setter 동작을 구현하는 Nativescript 클래스

아론 울랄

나는 nativescript hello world typescript repo를 살펴보고 있으며 nativescript의 Observable 구현으로 지루한 작업을하는 것을 발견했습니다.

뷰 모델어떻게 정의 되어 있는지 살펴보면 단순히 Observable라이브러리 를 확장하는 클래스임을 알 수 있습니다 . setter속성에 대한 메서드를 정의 할 때마다 수동으로 호출해야합니다.super.notifyPropertyChange("propertyName", propertyValue);

IMHO이 절차 속성이 많은 뷰 모델이있는 경우 매우 비효율적이며 오류가 발생하기 쉽습니다 .

이 작업을 자동화하는 방법이 있습니까? (아마도 어떤 setter에게도 알려주는 기본 클래스를 사용할 수 notifyPropertyChange있습니까?) 그렇지 않다면이 문제를 어떻게 처리하고 있습니까? Observable메커니즘 의 다른 구현이 있습니까?

피터 스타 에프

다음은 몇 가지 프로덕션 앱에서 사용했던 것입니다.

import { Observable } from "data/observable";

export class ObservableModel extends Observable {
    constructor() {
        super();
    }

    public get(propertyName: string) {
        return this["_" + propertyName];
    }

    public set(propertyName: string, value) {
        if (this["_" + propertyName] === value) {
            return;
        }

        this["_" + propertyName] = value;
        this.refresh(propertyName);
    }

    public refresh(propertyName: string) {
        super.notify({
            eventName: Observable.propertyChangeEvent,
            propertyName,
            object: this,
            value: this["_" + propertyName],
        });
    }
}

그러면 모델이 다음과 같이 보입니다.

export class LoginViewModel extends ObservableModel {
    get userName(): string { return this.get("userName"); }
    set userName(val: string) { this.set("userName", val); }

    get password(): string { return this.get("password"); }
    set password(val: string) { this.set("password", val); }
}

값으로 작업해야 할 때 다음을 사용하십시오.

const vm = new LoginViewModel();
vm.userName = "jdoe";
vm.password = "$3cr3T";

데코레이터 구현 업데이트 :

export function ObservableProperty() {
    return (target: Observable, propertyKey: string) => {
        Object.defineProperty(target, propertyKey, {
            get: function () {
                return this["_" + propertyKey];
            },
            set: function (value) {
                if (this["_" + propertyKey] === value) {
                    return;
                }

                this["_" + propertyKey] = value;
                this.notify({
                    eventName: Observable.propertyChangeEvent,
                    propertyName: propertyKey,
                    object: this,
                    value,
                });
            },
            enumerable: true,
            configurable: true
        });
    };
}

모델:

export class LoginViewModel extends Observable {
    @ObservableProperty() public userName: string;
    @ObservableProperty() public password: string;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Java List 구현 클래스를 제공하는 setter 만들기

분류에서Dev

PropertyInfo.SetValue ()는 기본 클래스의 속성에 setter가없는 경우 작동하지 않습니다.

분류에서Dev

파이썬 클래식 클래스에서 기본 동작을 중단하지 않고 __getattr__ 메서드를 구현하는 방법

분류에서Dev

`getNoise`에 대한이 호출이 하위 클래스 구현이 아닌 기본 클래스 구현을 사용하는 이유는 무엇입니까?

분류에서Dev

기본 유형을 기본 클래스로 사용하는 C ++

분류에서Dev

기본 클래스 (또는 인터페이스)를 동적으로 서브 클래스 (또는 구현)하는 방법은 무엇입니까?

분류에서Dev

이 기본 C ++ 클래스 구현을 이해하도록 도와주세요.

분류에서Dev

C # 8.0에서 클래스에 기본 멤버 구현을 노출하는 방법이 있습니까?

분류에서Dev

기본 클래스가이를 구현하는 객체의 속성을 알 수 있습니까?

분류에서Dev

OOP 디자인 : 동일한 기본 클래스로 다른 작업을 갖는 콘크리트 클래스

분류에서Dev

Builder.Default @ 기본 클래스에서 작동하지?

분류에서Dev

비동기 WCF 서비스 작업을 구현하는 이유

분류에서Dev

Observable 클래스에서 addObserver 및 deleteObserver의 동작을 명확히하십시오.

분류에서Dev

Observable 클래스에서 addObserver 및 deleteObserver의 동작을 명확히하십시오.

분류에서Dev

C # 8.0의 구현 클래스에서 일부 인터페이스 메서드의 기본 구현을 유지하는 방법은 무엇입니까?

분류에서Dev

기본 클래스를 확장하는 클래스에 대해 작동하지 않는 단위 테스트

분류에서Dev

C # : 클래스 변수, 기본값을 정의하고 작동하지 않는 설정 가져 오기?

분류에서Dev

파생 클래스의 const 값을 기본 예기치 않은 동작의 생성자에 전달하는 C ++

분류에서Dev

인터페이스를 구현하는 기본 클래스에서 파생 된 인스턴스 목록을 만드는 방법은 무엇입니까?

분류에서Dev

C #의 기본 클래스 구현

분류에서Dev

F # 기본 클래스 구현

분류에서Dev

Java의 동일한 클래스에서 다른 setter를 사용하여 setter에 값을 제공하는 방법

분류에서Dev

공통 기본 클래스가있는 Java 메타 클래스 목록 작성

분류에서Dev

공통 기본 클래스가있는 Java 메타 클래스 목록 작성

분류에서Dev

템플릿 기본 클래스 구현 기본 구현

분류에서Dev

NativeScript에서 JS를 사용하여 사용자 정의 클래스를 만들고 기본 Android에서 사용

분류에서Dev

정규 표현식을 사용하여 클래스 정의에서 기본 클래스 찾기

분류에서Dev

PowerShell 클래스의 기본 출력을 설정하는 방법

분류에서Dev

기본 클래스에서 poilymophic 호출을 피하는 방법

Related 관련 기사

  1. 1

    Java List 구현 클래스를 제공하는 setter 만들기

  2. 2

    PropertyInfo.SetValue ()는 기본 클래스의 속성에 setter가없는 경우 작동하지 않습니다.

  3. 3

    파이썬 클래식 클래스에서 기본 동작을 중단하지 않고 __getattr__ 메서드를 구현하는 방법

  4. 4

    `getNoise`에 대한이 호출이 하위 클래스 구현이 아닌 기본 클래스 구현을 사용하는 이유는 무엇입니까?

  5. 5

    기본 유형을 기본 클래스로 사용하는 C ++

  6. 6

    기본 클래스 (또는 인터페이스)를 동적으로 서브 클래스 (또는 구현)하는 방법은 무엇입니까?

  7. 7

    이 기본 C ++ 클래스 구현을 이해하도록 도와주세요.

  8. 8

    C # 8.0에서 클래스에 기본 멤버 구현을 노출하는 방법이 있습니까?

  9. 9

    기본 클래스가이를 구현하는 객체의 속성을 알 수 있습니까?

  10. 10

    OOP 디자인 : 동일한 기본 클래스로 다른 작업을 갖는 콘크리트 클래스

  11. 11

    Builder.Default @ 기본 클래스에서 작동하지?

  12. 12

    비동기 WCF 서비스 작업을 구현하는 이유

  13. 13

    Observable 클래스에서 addObserver 및 deleteObserver의 동작을 명확히하십시오.

  14. 14

    Observable 클래스에서 addObserver 및 deleteObserver의 동작을 명확히하십시오.

  15. 15

    C # 8.0의 구현 클래스에서 일부 인터페이스 메서드의 기본 구현을 유지하는 방법은 무엇입니까?

  16. 16

    기본 클래스를 확장하는 클래스에 대해 작동하지 않는 단위 테스트

  17. 17

    C # : 클래스 변수, 기본값을 정의하고 작동하지 않는 설정 가져 오기?

  18. 18

    파생 클래스의 const 값을 기본 예기치 않은 동작의 생성자에 전달하는 C ++

  19. 19

    인터페이스를 구현하는 기본 클래스에서 파생 된 인스턴스 목록을 만드는 방법은 무엇입니까?

  20. 20

    C #의 기본 클래스 구현

  21. 21

    F # 기본 클래스 구현

  22. 22

    Java의 동일한 클래스에서 다른 setter를 사용하여 setter에 값을 제공하는 방법

  23. 23

    공통 기본 클래스가있는 Java 메타 클래스 목록 작성

  24. 24

    공통 기본 클래스가있는 Java 메타 클래스 목록 작성

  25. 25

    템플릿 기본 클래스 구현 기본 구현

  26. 26

    NativeScript에서 JS를 사용하여 사용자 정의 클래스를 만들고 기본 Android에서 사용

  27. 27

    정규 표현식을 사용하여 클래스 정의에서 기본 클래스 찾기

  28. 28

    PowerShell 클래스의 기본 출력을 설정하는 방법

  29. 29

    기본 클래스에서 poilymophic 호출을 피하는 방법

뜨겁다태그

보관