As classes herdeiras de PiClass
possui um comportamento particular.
Há métodos auxiliares de construção, transformação e clonagem além das propriedades auxiliares.
- Os métodos de construção auxiliares predefinidos são:
- instances: invocada no inicio da construção da classe logo após instanciação;
- init: invocada no final da construção da classe na instanciação.
- create: cria uma instancia da classe passando todos os parametros como argumento para
instances()
einit()
- clone: cria uma copia do objeto atua
- cloneWillLoad: invocado antes da clonagem;
- cloneDidLoad: invocada após a clonagem do objeto.
Todo objeto passado por parametro na instanciação é injetado nas propriedades classe por padrão. Porém esse processo ocorre apos a invocação do método instances.
Esse comportamento pode ser desativado atribuindo false
para a propriedade _extendParameters
da class PiClass
.
- O métodos auxiliares de transformação são:
- Injeção:
inject(obj)
injeta todas as propriedades deobj
para dentro do objeto; - Conversão:
toJson()
converte o objeto em representação JSON; - jsonWillConvert: invocado antes da conversão do objeto em json;
- jsonDidConvert: invocado após a conversão do objeto em json
- Propriedades auxiliares:
- _extendParameters: Defini se o objeto passado por parametro na construção da classe será injetado no objeto;
- parameters: Propriedade somente leitura que retorna todos os parametros informados na instanciação da classe.
import PiClass from 'pyllar/class';
class Hello extends PiClass {
instances(){
this._name = 'Hello';
}
init(param){
this._param = param
}
cloneDidLoad(){
console.log('Socorro! foi clonado');
}
jsonDidConvert(){
console.log('Ops! foi convertivo');
}
print(){
console.log(this.msg);
}
}
const hello = new Hello({
msg: 'Olá mundo'
});
hello.print()
console.log(hello.toJson());
const newHellow = hello.clone();
newHellow.msg = 'Olá submundo';
newHellow.print();
Classe responsável por gerenciar o ciclo de vida, interação com a view e vinculos com o PiModel
.
O Pillar permite que o html contenha associação com dois tipos de diretivas: evento e expressão.
As diretivas de declaração permitem a utilização das expressões da linguagem. Além disso todo o corpo html pode receber as expressões. Dentro de cada expressão pode conter uma ou varias propriedades monitoradas.
Por padrão o Pillar não monitora as variáveis do elemento definidas nas expressões do html;
As diretivas de declaração são definidas por meio do prefixo :
enquanto
as diretivas de evento são definidas pelo @
;
-
Diretivas de declaração predefinidas:
- :for = intera
n
vezes por meio da contagemrange(n, inicio, passo)
; - :foreach = intera sobre propiedade do componente. Permite dois formas de epxressão =
(index, name) in property
ouname in property
; - :class = altera a propiedade class do elemento;
- :style = altera a propiedade style do elemento;
- :init = executa uma expressão na criação do elemento;
- :bind = associa alterações no elemento com uma propriedade;
- :on = associa evento a um método;
- :value = define o valor do atributo
value
do elemento; - :selected = define o valor do atributo
selected
do elemento; - :disabled = define o valor do atributo
disabled
do elemento; - :if = mostra o elemento se a expressão for verdadeira;
- :else = mostra o elemento se a expressão do
:if
adjacente superior for falsa - :model = permite vincular uma propriedade do model;
- :change = invoca um metodo sempre que o elemento dispara o evento
change
; - :src = define o valor do atributo
src
do elemento; - :checked = define o valor do atributo
checked
do elemento; - :mount = invoca método quando component associado for renderizado
- :render = callback para a instanciação de um componente que será renderizado no elemento em questão.
- :for = intera
-
Métodos auxiliares:
- inject: Injeta as propriedades do model nos elementos (data-model);
- get: Retorna o valor do component;
- set: Define o valor do component. Dispara o evento nativo 'change';
- dispatchEvent: Dispara um evento customizado nativo;
- render: Renderiza o component em um elemento;
- viewWillRender: Invocado antes da renderização;
- viewDidRender: Invocado após a renderização;
- watch: Observa por alterações na propriedade do componente;
- unwatch: Para de observar por alterações em uma propriedade do componente;
- destroy: Libera todos recursos e destroi o component;
- register: Registra o componento na aplicação
- Propriedades auxiliares
- $element : Retorna o elemento em jquery;
- element : Retorna o elemento nativo.
import PiComponent from 'pyllar/component';
export default class Hello extends PiComponent {
view = /*html*/`<div>
<div :render="() => new UserForm()"></div>
<div>essa propiedade <b>{name}</b> não é monitorada</div>
<div>esta propiedade <b>{@name}</b> é monitorada</div>
<input :change="ChangeMe($value)" :value="{name}" />
<button @click="clickme('{name}')">ClickMe()</button>
<button @click="changeName()">ChangeMe()</button>
<ul>
<li :foreach="planeta in planetas">{planeta}</li>
</ul>
<ul>
<li :foreach="(index, planeta) in planetas">{index + 1 }. {planeta}</li>
</ul>
<ul>
<li :for="i in range(10, 4, 2)">{i}</li>
</ul>
</div>`;
name = 'Mundo';
planetas = ['terra', 'marte', 'jupiter']
clickme(name){
console.log(`Meu nom é ${name} (:`);
}
ChangeMe(newValue){
this.name = newValue;
}
};
PiComponent.register(Hello);
Classe responsável por gerenciar as ações, os estado e os vinculos com componente view. Possui os seguintes métodos auxiliares:
-
initWithJson(json) : injeta o json recebido no objeto. Esse método é invocado automaticamente quando uma action retorna um objeto ou um array de objetos do servidor;
-
validators: Retorna todos as regras de validação que seráo aplicadas quando os dados de vinculos do componente foi injetado na model;
-
Inject: Injeta todos os elementos de pagina com atributo (data-model) nas propriedade do model, executando as regras definidas no validators;
-
Register: Registra o model no contexto da aplicação.
user.js
import PiModel from 'pi/model';
import CPF from './cpf';
export default class Model extends PiModel {
init() {
super.init('/api');
}
validators() {
return {
'name': new PiValidatorRequire('Informe o nome do usuário para continuar')
};
}
initWithJson(json) {
super.initWithJson(json);
this.cpf = new CPF(json.cpf);
return this;
}
actions() {
return {
'filtrarPorNome': 'GET:/filtrar-por-nome?name=:name'
};
}
};
PiModel.register(Model);
form.js
import PiComponent from 'pyllar/component';
import UserModel from './user.js';
export default class Form extends PiComponent {
view = /*html*/`<form>
<input data-model="name" placeholder="Informe o nome do usuário"/>
<button @click="salvar()">Salvar</button>
</form>`;
async salvar(){
const user = UserModel.create();
const err = user.inject(this);
if(err.length > 0){
return;
}
const newUser = await user.save();
console.log(newUser);
}
};
PiComponent.register(Form);
Toda configuração do framework é carregada pelos valores definidos em PiConfig.set()
.
Segue abaixo a configuração padrão
{
app: {
parse: {
enable: true, /** Boleano: define se o framework irá realizar um parse na inicialização */
selector: 'body' /** String: define qual será o elemento analisado */
}
},
html: {
loader: 'Carregando ...' /** String | Function : Define qual será o texto exibido para os componentes de carregamento assíncrono */
},
expression: {
xlanguage: /(\{>?)([^\}]+)(\})/gi, /** Regex: Expressão regular para as declarações em html */
xvariable: /(@)([\w\.]+)/gi, /**Regex: Expressão regular para as variáveis monitoradas */
xhtml: /(\{>)([^\}]+)(\})/gi, /** Regex: Expressão regular para declarações que retornam texto em html */
},
request: {
fetch: null /** Function: Função prioritaria executada na cadeia de chamadas pelo PiRequest */
}
}
Uma configuração específica pode ser buscado através do método get: PiConfig.get('app.parse.enable');
import { app } from "pyllar/env";
import Bootstrap from "pyllar/bootstrap";
import HomePage from "./views/home";
new Bootstrap()
.onLoad(() => {
app().register(HomePage);
})
.onReady(() => {
app().startServices();
})
.load();
class Bootstrap {
onInit(){
/**
* Hook de inicialização:
* - Executado na inicialização antes da instanciação da aplicação
*/
}
onLoad(){
/**
* Hook de carga:
* - Executado apos a instanciação da aplicação
* - Executado antes do carregamento e analise da pagina definida pelas configurações
* : PiConfig.get('app.parse.enable')
* : PiConfig.get('app.parse.selector')
*/
}
onReady() {
/**
* Hook de finalização:
* - Executado apos todo processo de carregamento da aplicação
*/
}
load() {
/**
* Inicia, carrega e executa a aplicação
*/
}
}
import { app } from 'pyllar/env';
import Component from './component';
app().register(Component);
app.js
import { app } from "pi/env";
import Bootstrap from "pi/bootstrap";
import PageService from './service'
new Bootstrap()
.onLoad(() => {
app().addService(new PageService());
})
.onReady(() => {
app().startServices();
})
.load();
service.js
import { app } from "pi/env";
import PiService from "pi/service";
import Page1 from './page1'
import Page2 from './page2'
export default class PageService extends PiService {
routes = {
'/page1'() {
app().setPage(new Page1());
},
'/page2?id=:id'(id) {
app().setPage(new Page2(id));
}
};
routeNotFound(route) {
console.log('route not found ' + route)
}
}
PiService.register(PageService)