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

Многостраничные приложения

Есть несколько возможных шаблонов для приложений с реактивными страницами. Более подробные сведения о создании реактивных приложений см. в руководстве Создание первой информационной панели и в документации.

Приложение с несколькими страницами в одном модуле

Если логика приложения достаточно простая, ее можно поместить в один модуль, даже если страниц несколько. Просто нужно определить дополнительные маршруты для каждой страницы, как в этом примере, в котором используется модуль StatisticAnalysis, определенный здесь:

module App
using GenieFramework
using Statistics
@genietools

# Реализуем реактивный код
@app begin
    @in N = 0
    @out m = 0.0
    @out name = "John"
    @onchange N begin
        m = mean(rand(N))
    end
end

# Определяем пользовательский интерфейс для каждой страницы
index() = [h1("Welcome {{name}}!"), a(href="/form")]
function formui()
    cell([
        textfield("How many numbers?", :N),
        p("The average of {{N}} random numbers is {{m}}"),
    ])
end


# Определяем маршруты
@route("/", index) # используем route вместо @page, чтобы не нужно было внедрять лишний код JavaScript
@page("/form", formui)
end

Есть и другой вариант — поместить код пользовательского интерфейса в отдельный файл и включить его следующим образом:

@page("/", "ui.jl")
    cell([
        textfield("How many numbers?", :N),
        p("The average of {{N}} random numbers is {{m}}"),
    ])

Приложение с несколькими модулями

Если страницы выполняют разные функции, например, одна страница — это информационная панель, а другая — панель настройки, их можно реализовать в отдельных модулях логики. После этого нужно просто включить каждый модуль в основной файл app.jl, как в данном примере:

module App
using GenieFramework
include("Index.jl")
include("Form.jl")
end
module Index
using GenieFramework

@app begin
    @out name = "John"
end

function ui()
    h1("Welcome {{name}}!")
end

@page("/", ui)
end
module Form
using GenieFramework
using Statistics

@app begin
    @in N = 0
    @out m = 0.0
    @onchange N begin
        m = mean(rand(N))
    end
end

function ui()
    cell([
        textfield("How many numbers?", :N),
        p("The average of {{N}} random numbers is {{m}}"),
    ])
end

@page("/form", ui)
end