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