>> Assim, com o que foi dito,
apenas uma espécie de simples introdução aos protótipos
eo modelo de objeto JavaScript.
Nós não vamos mudar engrenagens um pouco para falar
mais do JavaScript no servidor ea Biblioteca Bookshelf
ea conexão Knex Library.
Assim, você pode, na verdade, apenas -
se você procurar por Bookshelf.js ele deve ser muito fácil
de encontrar, deve ser a primeira resultado, e Bookshelf
como David mencionou apenas dá muita estrutura
em torno de objetos JavaScript e trabalhar com eles relacionalmente
em bancos de dados relacionais.
Assim, uma série de características semelhantes que na verdade é fortemente inspirado
por ORM do Laravel como bem como o Backbone.js,
que é um front-end MVC biblioteca que permite que você
estruturar seu código, semelhante ao que eu estava mostrando
com os exemplos da protótipos, onde pode -
em vez de apenas arbitrariamente jogando aulas
em seus pontos de vista aqui e ali.
Dá-lhe modelos e coleções desses modelos
que é suposto funcionar como espécie de um ponto único de verdade
sobre os dados sua aplicação.
E então você ouve, como aqueles modelos mudanças, você diz, OK,
re-tornar este modelo aqui e este aqui
e não apenas adicionar classe aqui, adicionar classe lá e tipo de escolher
em seletores e fazer a teia de aranha de código jQuery.
Dá mais de uma base de classe estrutura em pedaços individuais,
mas um componente importante de biblioteca é que os modelos
que tem uma estrutura semelhante para que os modelos de prateleira fazer.
Então, se você estiver familiarizado com o Estante você é bonita também
bastante familiarizados com Backbone.js modelos,
e eu recomendaria dar uma olhada nisso.
Assim, algumas das características principais
que lhe dá são apenas o capacidade de definir os dados em um objeto
para chamar buscar, que retorna um registro individual
a partir da base de dados, criar relações como semelhantes
ao que você lidou dentro em Laravel
onde você pode dizer um paciente definir um método de registro
e dizer que isso ganhou registro
onde o objeto de registro é registos de saúde nome da tabela.
Vamos ver.
Tem muitos - ele pertence -
apenas coisas que você é bastante semelhante -
bastante familiarizados com já, mas em JavaScript.
E sob o capô, para Bookshelf,
ele usa um construtor de consulta chamado Knex.js.
Então, isso é Knex, knexjs.org.
É uma referência para o brinquedo se alguém já jogou com isso.
Mas ele permite que você - em um forma semelhante, a jQuery,
que você acabou de criar um tipo de cadeia de métodos diferentes
que você está chamando em seu linha de banco de dados para que você possa -
você começou por dizer Knex eo nome da tabela.
Assim, por exemplo, usuários, Knex selecionar quais colunas você gostaria,
onde, e têm diferentes onde condicionais e você pode ter
E onde, ou quando, onde entre, onde não,
agora, para baixo da linha.
Você pode especificar diferentes junta entre as suas tabelas de banco de dados
Bookshelf que usa internamente a criação de uma espécie de magia
em torno do hasOne, hasMany, belongsTo, belongsToMany.
E assim, a combinação
dos dois permitem que você faça muito bem o que seria ser usado
no quadro como Laravel em termos
de funcionalidade trabalhar com bancos de dados.
Então, vamos em frente e tomar uma olhada em um exemplo simples
para um aplicativo Express, que faz uso destes modelos
e coleções de Bookshelf jazz [fonética].
Então, eu configurei-se apenas um aplicação simples aqui.
Tirei algumas das coisas que foi inicializado expressa
e mover-se de que em uma inicialização diretório que eu criei.
Uma das coisas agradáveis ​​sobre trabalhar com Express como suposto
para Laravel é que há realmente muito forçado
em você convencionalizada.
Assim, você pode criar diretórios -
ele realmente não lhe dar um lote inteiro para trabalhar fora.
Você tem apenas uma espécie de alguns definições básicas e depois -
mas não se importa onde colocá-los.
Você não tem que ter diretório do controlador.
Você não precisa ter um modelos diretório, um diretório de configuração.
Você pode criar uma espécie de aqueles que as suas necessidades de projeto
e definir as coisas da maneira que mais faz sentido para você.
Então, ao invés de ter tudo este clichê expressa
nos principais app.js eu disse iguais de aplicativos requerem o init / express.
E assim, no init,
a pasta inicializar Acabei de ter expresso aqui,
e isso requer Express, chamadas a função de configuração, chama o -
estabelece o mecanismo de exibição, Parser JSON, tudo isso.
Então, agora, vamos continuar a descer.
Então eu estou exigindo que o reunião instrutor do curso
e os requisitos de modelos.
Então, essas são em uma pasta que Eu só decidi modelos de nome.
Ele não tem que ser maneira no entanto, faz sentido,
mas os modelos é apenas bonita comum, então eu recomendo.
Mas - Então vamos para o curso.
Eu acho que eu estou usando - Sim, e os exemplos
aqui são todos baseados em torno do modelo de curso.
Então vamos tomar um olhar para isso.
Então, agora, apenas da primeira linha deste modelo,
Eu já estou requerendo outra coisa.
Então, se você vai notar no nó você deve estar exigindo
ou você vai acabar exigindo um grupo inteiro
de arquivos diferentes que estão localizados
em lugares diferentes em sua aplicação.
E os caminhos relativos para onde quer que esteja
em sua aplicação atual,
a menos que seja um nível superior já definido como em instalá-lo
com MPM como Bookshelf ou Knex ou Express ou algo assim,
aqueles que não são relativos.
Sim? Zoom mais?
OK. OK. Então, você está indo para acabam exigindo um grupo inteiro
de apenas diferentes arquivos em seu código, o que é bom e ruim.
De um jeito bom você sabe onde as coisas são e não é sorte
de magia, como o que é acontecendo sob o capô,
o que pode realmente ser confuso
quando você tem uma muito Java pesado -
ou quadro muito pesado como Laravel, que tipo de diz:
vamos cuidar deste modo você não tem
exigir tudo mas você tem
para saber como tudo trabalha, a fim de usá-lo.
Quando, como neste caso, é muito simples quanto aos
onde tudo é, eles são apenas extremidades
sendo até um pouco mais de digitação.
Assim como no lado Gosto de usar, há um plugin
se você usar um texto cego
onde você pode instalar o nó módulos auxiliares e você pode começar
para digitar como Instrutor e ele cria o caminho relativo
de onde você está para que arquivo de código, tipo de útil.
Assim, o modelo de curso está exigindo base aqui
e, em seguida, estagiário de base requer o init / estante
e, em seguida, o Bookshelf, ele requer o nível superior Bookshelf
e, em seguida, inicializa com a instância Knex inicializado,
que define o nome do cliente
e a conexão configurações para o banco de dados.
Então, eu só estou usando um simples instância do Sequel Pro que -
do MySQL, estou acessando com Sequel Pro e tem apenas uma espécie
de um banco de dados semelhante configuração como tivemos
no primeiro aplicativo de exemplo com o catálogo de cursos.
Então, eu definir a minha conexão configurações aqui,
e estes são todos documentados na página do projeto Knex.js
quanto ao modo de configuração essas conexões.
Então, agora tenho o meu modelo de base.
E como eu mencionei com a mudança de protótipo,
de modo que pode realmente ser uma espécie de muito para -
adiciona um monte de clichê ao seu código para convenção
que foi adaptado por Backbone.js
e agora é Bookshelf.js adicionar este método de estender
como uma propriedade estática em seus objetos JavaScript,
o que lhe confere uma espécie de quase baseada em classes herança natureza
onde se você chamar estender você pode configurar qualquer
dos métodos protótipo que você gostaria aqui
e, em seguida, você pode - qualquer métodos estáticos extras
que você pode querer, você pode simplesmente colocá-los a si mesmos
aqui para que eu possa estendê-lo com - por isso, se por exemplo,
vários modelos necessários exibir o nome e este obter o nome.
Então, aqui, eu estou dizendo que o nome de exibição para o modelo
por padrão, é o que quer que seu nome propriedade é outra forma de retorno
nenhum nome.
E agora em cada modelo que é a -
que se estende este modelo base, eu Agora temos um método nome de exibição
no protótipo cadeia em algum lugar.
E se eu quiser substituí-lo Só posso defini-lo - definir o que -
getname estaria aqui.
E ele permite que você imitar herança clássica
no JavaScript, que pode ser legal específica para que as coisas
que são prestam-se a ser classe base como modelos de objetos.
Então, vamos pular de volta para o código do aplicativo.
Então eu tenho uma rota para apenas slash, apenas para meu índice
e, em seguida, cortar cursos.
E ambos estão chamando o método renderCourses.
Então, novamente, as funções são primeira classe e pode ser transmitido
como argumentos para métodos.
Assim, neste app.get, Eu estou chamando -
Eu estou passando renderCourses como argumento.
E render - ou funções pode ser configurado como var -
como eu estava fazendo antes var renderCourses igual função
ou eles podem ser simplesmente renderCourses função.
Não faz muito muita diferença.
Você pode realmente ter o que são chamados de função nome
expressões, que são renderCourses var iguais
renderCourses função.
E, a razão para querer ter funções citar particularmente
no nó é que ele dá-lhe um produto de limpeza -
rastreamento de pilha mais legível.
Então se você tem um grupo inteiro
de funções anônimas ele vai dizer -
quando você tem um erro no seu código pois você -
você não vai saber qual a função está chamando você teria que olhar
com o número de código eo número da linha
e às vezes é mais fácil só para analisar visualmente
quando você realmente tem nomes
para as funções si no lado do servidor.
Portanto, este renderCourses, vamos chamar aplicativos nó -
então eu estou escutando Núcleo 3000 [fonética].
E assim, tudo isso está fazendo para a direita aqui está apenas começando todo o
cursos a partir de banco de dados.
Não estou nem limitando- por isso está fazendo um número enorme
de linhas ele está retornando.
E para fazer isso,
no modelo claro que há é uma propriedade estática
chamado coleção.
E então eu só chamá-lo - I disse criar uma nova coleção
para este curso, e depois buscá-la,
e, em seguida, retornar os cursos coleção aqui na promessa.
Assim, internamente, David in - o última metade ensinou um pouco
sobre promessas e promessas são usado muito fortemente, tanto Knex
e porque Bookshelf empresta o -
dá-lhe a capacidade de ter um monte
de diferentes chamadas assíncronas e tipo de juntar, em seguida, em conjunto
ou buscar alguma coisa, e, em seguida,
com essa chamada outro chamada de banco de dados assíncrono
e retornar esse valor e em seguida, saltar para a próxima então
e ao lado, em seguida, e depois ter uma pegar no final para classificar
tentativa de imitar captura assíncrona comportamento com código assíncrono,
porque você está vendo agora
mas é ainda mais difícil, uma vez você começa a lidar com isso.
Código assíncrono é apenas em todos os lugares
no lado do servidor e JavaScript realmente a um grau muito maior
do que você está acostumado a se você fez JavaScript
no lado do cliente.
Então isso realmente você ajudou lá fora.
Mas apenas para mostrar-lhe a declaração depurador
que eu estava falando em as ferramentas inspector nó,
Eu estou indo para ir em frente e lançar uma linha depurador aqui
na função renderCourses e ver onde isso me leva
quando eu - então nó inspetor pode ser instalado
fazendo NPM Instalar com uma bandeira G,
o que significa global Inspector Node.
E vai buscá-la para o NMP e instalá-lo globalmente
para suas aplicações assim você pode simplesmente chamá-lo
a partir da linha de comando.
Eu já instalado , então eu vou em frente e -
na verdade, ele pode ter esperar ele só vai ter,
tomar dois segundos.
E o inspetor nó novamente permite que você
fazer é ter este sem cabeça versão do console do depurador
que você está acostumado a quando se trabalha no lado do cliente e ser capaz
para parar, basta adicionar especificada aponta em seu código.
Pare a execução e dar um olhar para o que está acontecendo,
o que teria realmente vir a calhar se o recurso
como que estavam disponíveis
ao depurar o seu Código PHP, tenho certeza.
Então vamos tomar um olhar para isso.
Então eu só posso chamar Inspetor nó
e ele vai dizer visitar este URL porta 5858 para iniciar a depuração,
isso é apenas o padrão de como ele é iniciado.
Então, eu agora tenho - não há nada acontecendo aqui
porque eu preciso para começar.
Então nó impasse [fonética] o sinalizador de depuração e, em seguida, app.js.
Por isso, diz depurador escutando na porta 5858,
Escuta Server Express em 3000.
Por isso, é bom para ir.
Deixe-me apenas atualizar isso.
E agora eu posso ver as app.js código que eu estava apenas olhando para
mas aqui no console.
Então, agora, se eu tentar executar este, Você pode vê-lo, ele pára.
Ele está apenas esperando, porque a sua Toda a execução de código é agora
parado nesta depurador linha que eu coloquei lá.
E eu posso agora servidor -
[Inaudível Observação]
Oh, sim. Qual é a palavra-chave atalho para aumentar a tela?
Oh que existe.
Entendi. OK.
[Pausa]
Oh, ele não está olhando [Fonética] isso.
Assim, os cursos é muito grande
porque eu não estou fazendo um cláusula ou nada limitar,
é só ir buscar o base de dados completa de cursos
que são um monte deles.
E assim - o que é objeto
que realmente pode falhar a instância inspetor nota.
É - OK.
Deixe-me fazer um limite e então nós podemos dar uma olhada
quando ele não está buscando centenas de cursos.
Então, matar o servidor e inspetor
e eu vou fazer curso limite consulta de coleta 20.
Assim, em Bookshelf, ao contrário de Laravel
onde você pode apenas chamar limitar, direta ou ligar para qualquer
destes métodos SQL que você use
diretamente na instância ORM.
Toda vez que você está usando apenas Método SQL que é fornecido
em Knex, você tem que chamar a consulta para classificar
de explorar a cadeia de consulta.
E isso pode ser invocado ou com uma função,
para que você possa dizer, a função este limite de 10 ou você chamá-lo
especificando quais método que você gostaria de chamar
na instância Knex e, em seguida, que valor.
Então, nós vamos fazer limite de 20 e, em seguida, definir.
Nós realmente não fazer precisa depurador aqui
porque podemos apenas definir pontos de interrupção
e que faz com que seja mais fácil.
Tudo bem.
Então, vamos definir um ponto de interrupção aqui e tentar carregá-lo.
Linha errada.
Bem aqui.
[Pausa]
OK. Então ele parou de novo.
Então, agora, os cursos é um objeto com comprimento de 20
e podemos ver todos os diferentes modelos que é buscada
do banco de dados aqui então eu tenho um objeto de modelo
que tem, no interior da atributos da propriedade
sobre o objeto são todas as coisas que é encontrado no banco de dados.
Quaisquer eventos que têm sido registrado
para que você possa registrar diferentes eventos,
por exemplo, quando o modelo está sendo excluído
ou quando ele está sendo buscado,
Você pode definir diferentes propriedades ou modificar as coisas.
Há um monte de diferentes ganchos e estes são todos documentados
nas Bookshelf.js documentação que permitem que você
para fazer uma espécie de nada que você realmente quer fazer
com os seus modelos e coleções.
Você pode - eles foram feitos ser muito personalizável
e muito fácil para você adaptá-los
para as necessidades da sua aplicação.
Mas olhando apenas por aqui,
Eu posso ver o que o diferente cursos estão disponíveis.
E, neste caso, I realmente não buscar
com quaisquer outros além dos dados apenas os próprios cursos.
Mas de um modo semelhante ao o eloquente ORM você pode definir
as relações, de modo que o curso pertence a muitos instrutor.
Então, se eu ir em frente e suspender a execução,
saltar para este buscar chamada, pode especificar diferentes opções
que você gostaria de repassar a ele.
E um deles é o capacidade de carregar código relacionado
especificando withRelated instrutores então cursos.
Então, vamos voltar e fresco isso aqui e parar de novo.
Então, agora, objeto dos cursos, mesmo número de modelos,
mas agora cada modelo tem um hash de relações
que tem os instrutores que é relacionado.
Assim, este curso, por exemplo,
É claro que é 082 tem dois modelos instrutor relacionados.
E você já pode ver como muito mais fácil este é classificar
de trabalhar visualmente com que quando você está lidando com coisas
que tipo de alterar o código e, em seguida, tentar novamente em PHP.
O fato de que você pode apenas interromper a execução totalmente
e avaliar o que está aqui e a - no console, o -
diminuir o zoom, cursos é, você sabe,
o que que o âmbito local variáveis ​​estão disponíveis
e este é atualmente o mundial objeto porque, como você viu,
a não ser que você chama com um contexto específico, que não vai
ter algo relevante aqui.
E então, o - deixe-me mostrar mais alguns exemplos
implementação de promessas.
Então, ao invés de fazer isso instrutores withRelated aqui eu sou
indo para ir em frente e passar esta para buscar e, em seguida, os cursos,
Eu vou voltar instrutores courses.load.
E então - então você chama então.
[Pausa]
Então, em seguida, neste ponto, o cursos devem ser carregados
com os instrutores, que é uma ação assíncrona.
Mas porque estamos devolvendo- a partir de uma promessa, o próximo valor
para, em seguida, é tudo o que esta chamada retorna assíncronos
que neste caso a carga é um método em Estante
que realmente retorna a coleção em si.
Então tem de carregar o instrutores de lá
e, em seguida, você pode especificar - se é apenas uma propriedade,
você pode especificar esta como corda, caso contrário,
você pode fazer instrutores e requisitos
como um método - desculpe, como uma matriz.
E então se você gostaria de ter muito chique e restringir qualquer
destes dado buscas, você pode especificá-lo como um hash
com instrutores e, em seguida, o que Você gostaria de limitar a consulta on.
Então, eu gostaria de carregar tudo instrutores em cursos onde -
assim QB para construtor de consulta onde o status é ativo.
E você pode ficar muito fantasia com qualquer
das consultas relacionadas que você gostaria de construir.
Mas, só por agora, vamos se ater a apenas instrutores
e nós estamos devolvendo esse valor
por isso, então a próxima, em seguida, deve ter todos os cursos carregado
corretamente.
E se houve um erro em qualquer passo que a corrente,
seria pular para a captura.
Então, vamos em frente e executar isso.
Assim, cada vez - ao contrário de PHP, uma desvantagem é o
"Porque nó" é uma longa corrida processo, você realmente precisa
para parar o processo nó como você atualizar seu código,
porque a versão que é execução no tempo de execução é,
a versão do o código que foi carregado
quando começou a não o que você tem sorte
atualizados de seu código com desde então.
OK. Vamos definir um ponto de interrupção aqui, aqui e atualização.
[Pausa]
Ah, eu realmente não fiz atualize esta página ou
por isso foi sobre o processo de idade.
Então você atualizar tanto este eo inspetor nó.
Então, agora, vemos cursos.
Se nós apenas tomar amostra de um destes modelos,
podemos ver que as relações objeto está vazio, mas agora -
ea razão que você precisa definir pontos de interrupção é, bem,
Eu mencionei que você pode saltar para o rastreamento de pilha
e ver o que você sabe, onde vai no app.
Então agora eu posso ver o que está acontecendo no método de carga,
que eu defini nas coleções.
É uma espécie de "cargas Ansioso relacionamentos para um já ".
E você pode percorrer e ver linha por linha
onde este material é vai que é ótimo.
Se você tem algo que está quebrado em seu código,
ele está jogando um pouco de erro e você é como, eu realmente quero
para ver onde isso vai dar.
Mas assim que você tiver algo assíncrona, o -
ele vai para a próxima carrapato do ciclo de eventos
e você vai perder a sua - você perde o seu lugar
no Inspetor de nó.
Então, você precisa dizer: "OK, uma vez que eu perder isso,
ele precisa parar agora nesta linha de novo. "
Porque se eu continuava batendo para baixo, para baixo da pilha,
teria, eventualmente, apenas ido embora se eu não definir esta
linha 22 linha azul pausa.
Então, agora, se eu olhar em cursos aqui,
deveria em relação instrutores
e, então, a instrutores anexá-los.
Assim, você pode ver que eu voltei uma promessa da primeira promessa
E então você pode continuamente fazer isso para baixo da linha.
Assim, a promessa diferente, prometo bibliotecas,
Eu usei um chamado Bluebird que é realmente útil.
Ele adiciona um monte de bom deste para mudar assíncrono -
mudando chamada de volta código de base em material
que funciona bem com promessas.
Mas - desculpe [inaudível] que Eu ia dizer isso aí.
Vamos dar uma olhada embora no -
então vamos dizer que houve uma problema ao buscar alguma coisa.
Então, eu tenho essa outra rota para encontrar chamado ID curso.
Então vamos fazer curso de 2.
Posso obter - Curso de JSON.
E isso faz [inaudível].
[Pausa]
Sinto cheiro de algo errado aqui.
Não em 3000, eu estava em guia inspetor Chrome.
OK. Então vamos para claro - JSON curso 1.
E isso retorna apenas em JSON formato, o curso carregado
com alguns instrutores.
Mas o exemplo que eu queria para dar aqui é que,
Estou fazendo curso JSON ID.
E nos parâmetros de busca, Eu estou especificando exigem verdadeiras,
que é uma opção que é documentada em Bookshelf
onde ele está dizendo que: "Se, Eu tento encontrar este curso
e ele não está lá, em seguida, lançar um erro. "
E isso deve ser capturado por a captura bloquear aqui.
Então, vamos em frente e voltar para o inspetor nó e tentar
e quebrar isso e ver o que temos.
Então, vamos definir uma quebra de aqui no curso de JSON.
Tudo bem.
Eu vou para o curso e JSON Gostaria apenas de colocar em algum -
[Pausa]
Ele pode ser um pouco complicado às vezes, quando você está tentando
para gerenciar qual foi atualizado
e que não tem - vamos ver.
Por isso, está chamando de erro resposta vazia.
[Pausa]
Vamos jogar um depurador aqui.
Devido à forma como nó realmente otimiza
para o tempo de execução JavaScript para ser tão rápida no servidor,
às vezes o depurador nó tem alguns erros quando você tenta
e definir pontos de interrupção dinamicamente e você realmente precisa
usar um depurador e não a linha-a-linha.
Então, vamos ver se este fica-nos o que queremos.
Então eu definir, app.get id curso json,
e eu tenho o meu depurador lá
na instrução catch na parte inferior.
Fetch requerem verdade, deveria - tudo bem, lá vamos nós, quebrou.
Então, agora eu posso ver que parou
neste último bloco catch porque o withRelated -
ou porque a exigir verdade especificada e não existe naturalmente
com a identificação deste grande número através de uma exceção
que agora é Emessage.
E cada erro no JavaScript tem uma propriedade de pilha
que vem junto com ele.
Por isso, é muitas vezes útil Para por exemplo,
consolar sair e.stack.
E eu posso realmente ver quando eu bati um erro.
Então eu recebo erro vazio de resposta, que é a mensagem
que foi enviado via Bookshelf.
Mas agora, eu posso dar uma olhada no, a chamada pilha e ver
que em Bookshelf dialetos SQL modelo 83,
esta resposta vazia erro foi acionada.
E é aí que eu mencionado, é ponto anônimo
porque é um anônimo função.
Se isso fosse uma função de nome você teria melhores idéias
para que funcione realmente através sem ter que ir
no código model.js.
Embora seja destinado a ser bastante, bastante legível,
para que eu possa ver que online.
O que eles dizem me era a linha 83.
Então, se options.require e não existia a resposta,
ele agora lança um novo erro de resposta vazia.
Assim você pode ver muito simples como isso funciona.
E internamente em Bookshelf,
não é apenas um todo bando de uso de promessas.
Assim, você pode especificar Promise.method
com a biblioteca Bluebird que mantém o contexto correcto
deste, quando regressava uma promessa.
E assim eu - eu estou ligação o valor desta semelhante
ao que eu tinha mencionado anterior, mas utilizando promessas
e então eu posso - é novo.
Pode ser assíncrona ou não, se eu quiser.
E então eu fazer alguma outras coisas que podem
ou podem não ser assíncronas e em seguida, os tipos de saltos para baixo isso.
Então Promise.all é um auxiliar que um monte de bibliotecas populares têm
onde você pode ter um variedade de potencialmente pode
ou podem não ser promessas.
E uma vez que todos os que são concluída, você retornará que
e, em seguida, ela salta para a próxima linha
e você pode ver como ele realmente achata a pirâmide
que você começa, o inferno callback como seu conhecido
se você está fazendo tudo com retornos de chamada linha por linha.
Há maneiras de contornar isso, mas as promessas são uma
das melhores maneiras na minha opinião
para realmente manter o seu código limpo e de fácil leitura.
Então, isso é apenas uma pequena introdução ao JavaScript
e Bookshelf e Knex em geral.
E, se há alguma dúvida, Eu sei que é uma tonelada de material
a sorte de tentar e tampa especialmente porque as línguas,
ao contrário da maioria de que você é familiarizado com, então eu só queria
para fazer com que pelo menos se você está tendo problemas
com o seu código, você pode classificar de pular -
isso é o que eu gosto de fazer, é tipo de saltar para as bibliotecas
que eu estou usando e veja como as coisas são estruturados.
Há um que eu tinha mencionado anteriormente chamado Backbone.js
e na verdade, é [Inaudível] no lado do cliente
para ajudar a dar vista do modelo estrutura controlador
ao seu código.
Mas ele realmente tem fonte da documentação anotada
que permite classificar de ver.
É realmente bem documentada, o que está acontecendo,
como está aumentando a funcionalidade Ajax
ou a funcionalidade de eventos ou Os modelos e coleções tipo
de explicar o que é acontecendo no processo.
E se você entender os conceitos básicos de JavaScript
como a herança prototípica e apenas como funções são usadas
que ambos os objetos e valores e classes e tudo mais.
Isso torna muito mais fácil para entender o que está acontecendo
em potencial no bibliotecas que você está usando
e código depurador e ser capaz a não ser bater a cabeça
contra a parede porque você não entender como o
diferentes peças estão trabalhando, então.