Изменение реактивных переменных в различных контекстах
Изменять значение реактивной переменной, помеченной как @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.
Чтобы модель, созданная для маршрута, была доступна из других контекстов, ее необходимо сделать глобальной.