bayrell / BayLang

BayLang compiler source code
https://bayrell.org/ru/docs/baylang
Apache License 2.0
4 stars 0 forks source link

Реактивные классы #160

Open ildar-ceo opened 2 months ago

ildar-ceo commented 2 months ago

Реактивный класс

@Reactive
class User
{
    string name = "";
}

/* Create reactive object */
User user = new User;

Способ 1

/* Listener */
fn onChange = void (Dict params)
{
    if (params.get("message") != "change_attr") return;
    string key = params.get("key");
    var value = params.get("value");
    print("Change attr " ~ key ~ " to " ~ value);
};

/* Create listener */
@.listen(user, onChange);

/* Change attr */
user.name = "Alice";

/* Remove listener */
@.stopListen(user, onChange);

Способ 2

var listeners = new ReactivePull;

/* Listener */
fn onChange = void (Dict params)
{
    if (params.get("message") != "change_attr") return;
    string key = params.get("key");
    var value = params.get("value");
    print("Change attr " ~ key ~ " to " ~ value);
};

/* Add item and listener */
listeners.addListener(onChange);
listeners.addItem(user);

/* Change attr */
user.name = "Alice";

/* Destroy listener pull */
listeners.destroy();

Должен вывести сообщение:

Change attr name to Alice
ildar-ceo commented 2 months ago

Компонент

<script>

var listeners = new ReactivePull;

/**
 * On mounted
 */
void onMounted()
{
    this.listeners.addListener(method this.onChangeModel);
    this.listeners.addItem(this.model);
}

/**
 * On unmount
 */
void onUnmount()
{
    this.listeners.destroy();
}

/**
 * On change model
 */
void onChangeModel(Dict params)
{
    string message = params.get("message");
    if (message == "get_attr")
    {
        var value = params.get("value");
        this.listeners.addItem(value);
    }
    else if (message == "change_attr")
    {
        var old_value = params.get("old_value");
        this.listeners.removeItem(old_value);
        this.repaint();
    }
}

</script>