Документация Engee

Изменение реактивных переменных в различных контекстах

Изменять значение реактивной переменной, помеченной как @in или @out, следует извне блока @onchange.

::alert{type="info"} Это продвинутый пример.

Откройте вкладки браузера по следующим маршрутам по порядку: /, /test, /global. Вы увидите, что при открытии /global текст на вкладке /test меняется на global!.

module App
using GenieFramework, Stipple
@genietools

@app begin
    @out message = "Hello!"
    @onchange isready begin
        @show "App is loaded"
        @show __model__
    end
end

route("/test") do
    global model = @init
    @show "Test route"
    @show model
    model.message[] = "test!"
    page(model, ui()) |> html
end

route("/global") do
    @show "Global route"
    model.message[] = "global!"
    page(model, ui()) |> html
end

ui() = "{{message}}"

@page("/", ui)
Server.up()
end

Модель также может изменяться извне модуля App следующим образом:

App.model.message[] = "Outside of App module"

Объяснение

Доступ к реактивным переменным внутри блока @onchange можно получать напрямую либо через имя переменной, либо через объект __model__. Объект __model__ — это структура ReactiveModel, которая содержит реактивные переменные и код @app.

При выполнении запроса по маршруту для этого запроса создается новая модель. Она содержит копию реактивных переменных и кода, объявленного в @app, и к ней можно получить доступ с помощью макроса @init.

Чтобы модель, созданная для маршрута, была доступна из других контекстов, ее необходимо сделать глобальной.