Category Archives: JavaScript

HTTP 406 Erro ao usar $http.get Angular contra pontos de extremidade de resto do SharePoint

Atualização: Marc AD ndersson apontou este grande pedaço de informação: http://Blogs.Office.com/2014/08/13/JSON-Light-support-REST-SharePoint-API-Released/. Isso explica muita coisa :).

Isso pode ser o pior título de um post de blog já! Seja como for.

Normalmente faço tudo do meu prototipagem contra uma instância O365. Eu tenho minha instância pessoal para que não tenho que me preocupar que afetam qualquer outro. Como um aparte – lembra quando nós chamamos carreg em torno de máquinas virtuais em nossos laptops com musgo – SQL Server, IIS, decidindo vs Hyper-V. VMWare? Seja como for...

Eu tinha desenvolvido um aplicativo usando Angular neste ambiente que faz, entre outras coisas, Isso:

$http.Get(serverUrl)
.sucesso(função(dados, estatuto, cabeçalhos, config) {

var getLinksResponse = dados;

getLinksResponse.value.forEach(função(theResult) {

// e assim por diante e então espuma

Isto estava funcionando muito bem em dois ambientes diferentes do SharePoint online. No entanto, Quando o meu colega é portado para uma instância de Cloudshare, Ele estava ficando um HTTP 406 erro (Qual foi a primeira vez que tive aquele, Então... yay, Eu suponho). Nós fizemos um pouco de pesquisa e notei que o cabeçalho de "Aceitar" estava fora. SharePoint online foi perfeitamente feliz com:

Aceitar: application/json

Mas a instância cloudshare (Qual é o SP na prem, hospedado em um servidor virtual) queria o clássico "odata = verbose" adicionado em também:

Aceitar: application/json;OData = verbose

Para corrigir isso, adicionamos o cabeçalho como tal:

config var = {cabeçalhos: {
'Aceitar': ' application/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.sucesso(função(dados, estatuto, cabeçalhos, config) {

var getLinksResponse = dados;

getLinksResponse.value.forEach(função(theResult) {

// e assim por diante e então espuma

Que livrou o 406, Mas isso também mudou o formato da resposta. Era mais... detalhado. (haha!) Mais mudanças foram necessárias e aqui está o resultado final:

config var = {cabeçalhos: {
'Aceitar': ' application/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.sucesso(função(dados, estatuto, cabeçalhos, config) {

var getLinksResponse = dados;

getLinksResponse.d.Results.forEach(função(theResult) {

// e assim por diante e então espuma

Este só se transformou em um 30 minuto problema para nós, Então nós tivemos sorte. Espero que alguém acha isso útil.

</fim>

Angular falha para inicialização no IE9

Eu fui brincar com Angular.js para o último tempo enquanto e para a vida de mim, Não consegui meus apps Angular para lançar no IE9.  Todos eles trabalham muito bem em IE11 mas IE9 só mostraria o chaves e bits semelhantes.

Eu procurei e não consegui encontrar ninguém reclamando sobre o problema dele.  Funcionou bem no Chrome, IE11, Só não o IE9.

Fui jogado pelo fato de que o console do IE estava me dando erros como este:

SEC7111: A segurança HTTPS está comprometida por res://ieframe.dll/forbidframing.htm

Esse erro me fez pensar que havia algum problema transferindo o angular ou outras bibliotecas que eu precisava.  Como acontece, Isto não era a questão.

Por bisbilhotando a internets, Finalmente descobri que eu precisava para procurar a frase era "bootstrap" e que parecia que a inicialização estava falhando.  No final, meu problema era que eu tinha decorado meu <HTML> marca com o atributo ng-app, como em:

<ng-aplicativo HTML = "MatrixApp">

Bem, Isso não funcionou para o IE9.  Em vez disso, Enrolei todo o resto do HTML na <corpo> dentro de um div e referências MatrixApp assim.

Problema resolvido.

Espero que este alguém salva algum sofrimento.

</fim>

Crescente consciência / Adoção de Frameworks JavaScript

Meu colega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), escreveu um curto Resumo blog post sobre frameworks ele gosta ou pelo menos tem usado com o SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery parece ter sido o vencedor no campo, por assim dizer, Há anos, Mas os outros são mais novos e Alambiques tipo de batem-, como Angular. (SPServices, É claro, é um salva-vidas há anos e continuará a ser, então eu acho que).

O que as pessoas estão usando? Eles são focados mais em ferramentas da Microsoft (CSOM / JSOM) ou movendo-se mais em direção Angular, Nocaute, Ember, etc?

Eu tenho uma crescente polarização em direção a essas estruturas não-Microsoft. Acho que as coisas MSFT são mais difícil e mais difícil de trabalhar com, exigindo quase tanto de curva de aprendizagem como estilo antigo colaborador de lado do servidor.

Postar um comentário aqui ou no Big Apple SharePoint Se você quer discutir (Big Apple terá mais probabilidade de uma boa discussão).

</fim>

Superar o problema chato com Urls relativas em SharePoint Quick Launch

Eu queria adicionar um link para a navegação de lançamento rápido no outro dia e SharePoint me disse:

image

Versão de texto puro do que é:

Certifique-se de que o URL é válido e começa com qualquer um caractere válido (um sinal de número (#) ou barra (/)) ou um válido suporte protocolo (por exemplo, ' http://’, ' https://’, ' arquivo://’, ' ftp://’, ' mailto:’, «Notícias:’).

"Blech e varíola!"Eu disse.

Uma solução para isso é usar JavaScript para encontrar um link conhecido no lançamento rápido e substituir o comportamento de.

Para testar isso, Adicionar um novo link para o seu site de teste desta forma:

image

Eu usei o jQuery. Para resolvê-lo, pegar um pouco de JavaScript e jQuery para a página usando sua técnica favorita e com uma linha de código como este:

 

$(documento).pronto( função () {

    $("uma:contém('Substituição de URL de teste')").Clique em(função () { alerta("comportamento de clique alterados!"); Voltar falso;});

});

E Bob é seu tio.

O seletor do jQuery encontra cada <uma> marca que tem a "Substituição de URL de teste" em seu nome. Você pode querer encontrar-melodia que dependendo do seu link e tal.

As meretrizes(função() Substitui o SharePoint teria feito quando o usuário clicou. Certifique-se "retorna false" ou então vai fazer suas coisas e depois tentar a coisa href também, quase de certeza que não é seu objetivo.

Isso foi feito e teste em um ambiente de SharePoint online mas deve funcionar bem em 2010 e mais cedo demais.

</fim>

undefinedSubscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Coitado do cache em JavaScript

[TL;DR versão: utilizamos cookies para armazenar os resultados de chamadas assíncronas; processar os resultados das últimas chamadas assíncronas imediatamente e em seguida, validá-los após o carregamento da página.]

Tenho trabalhado no site de intranet do SharePoint para um cliente que apresenta, entre outras coisas, uma navegação secundária estilizada, cujas opções de menu são gerenciadas através de uma lista personalizada velha regular.  A idéia é que o cliente obtém controle menu do "seu" site sem afetar ou ser afetado pela navegação global, por isso.

(Há algo de incrivelmente subversiva sobre a adição de um CEWP que aponta para um arquivo HTML que carrega alguns CSS e JS fundamentalmente alterar quase tudo sobre o comportamento de um site... mas isso é para outro post)

O código para esta bem simples:

O local dolorido, aqui é que toda vez que alguém bate uma das páginas do site, navegador da web do usuário que está tentando para obter os itens da lista.  Uma vez que o colaborador é completo e teste provou coisas para ser estável e completa, Essa chamada não é necessário mais do que 99% o tempo desde o menu raramente muda.  Também tem um estranho efeito de interface do usuário que é comum este admirável mundo novo de hiper-ajaxy web sites – processa a página e só então é que o menu render.  É nervosa e distraindo na minha opinião.  E nervoso. Assim, armazenamento em cache. 

Eu modifiquei a lógica desta forma:

  • Procure um cookie no navegador que contém o menu como última li-
    • Se encontrou, torná-lo imediatamente.  Não espere terminar o carregamento da página.  (Você precisa ter certeza de que seu HTML é estrategicamente colocado aqui, Mas não é difícil de fazer).
  • Esperar a página terminar de carregar e fazer async chamada para carregar itens de menu de uma lista usando o resto ou Lists. asmx ou qualquer outro
  • Comparar o que eu tenho contra o cookie
    • Se combina com, PARAR
    • Caso contrário, usando jQuery, popular dinamicamente um bando se <Li>está em um <UL>
  • Usar CSS para fazer toda a formatação
  • Lucro!

Alguns de vocês vão dizer, "Ei! Não há verdadeiro cache aqui desde que você está lendo o menu Enfim cada vez que.”  E você está certo-eu não vou dar o servidor qualquer tipo de pausa.  Mas porque a chamada é assíncrona e acontece após a página inicial carga HTML totalmente processa, "parece" mais ágil para o usuário.  O menu processa muito tanto quanto desenha a página.  Se o menu acontece para a mudança, o usuário é submetido a uma re-desenhar nervoso do menu, Mas só uma vez.

Existem algumas maneiras de tornar mais eficaz esta cache e ajudar o servidor ao mesmo tempo:

  • Colocar em uma regra que o cache de"cookie" é válido por um período mínimo de 24 horas ou algum outro período de tempo. Enquanto não há nenhum cookie expirado, Use o instantâneo de menu do cookie e nunca bateu o servidor.

Bem... isso é tudo o que vêm à mente agora :). 

Se alguém tiver alguma idéia inteligente aqui eu adoraria conhecê-los.

E por último – esta técnica pode ser usada para outras coisas.  Página do cliente, este tem uma série de coisas orientado a dados em várias páginas, muitos deles relativamente raramente mudando (como uma vez por semana ou uma vez por mês).  Se você destinar a áreas específicas de funcionalidade, Você pode dar uma interface de usuário mais responsiva puxando o conteúdo da loja do cookie local e tornando-se imediatamente.  Parece mais rápido para o usuário, mesmo se você não está salvando o servidor qualquer ciclos.  Você pode Salve os ciclos de servidor por decidir em algumas condições e gatilhos para invalidar esta cache local de cookie.  Isso é tudo situacional e artsy coisas e realmente a coisa mais divertida :). 

</fim>

undefinedSubscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin