Archivo de la categoría: JavaScript

HTTP 406 Error al utilizar $http.get Angular contra SharePoint resto puntos finales

Actualización: Marc AD ndersson señaló esta gran pieza de información: http://blogs.Office.com/2014/08/13/JSON-Light-support-Rest-SharePoint-API-released/. Eso explica mucho :).

Nunca puede ser el peor título de una entrada de blog! ANYHOO.

Normalmente hago todos mis prototipos contra una instancia O365. Tengo mi instancia personal así que no tengo que estar preocupado de afectando a nadie. Como acotación al margen – recuerda cuando llamamos llevados alrededor de las máquinas virtuales en nuestros ordenadores portátiles con musgo – SQL Server, IIS, decidir vs Hyper-V. VMWare? En fin...

Había desarrollado una aplicación usando Angular en este entorno que hace, entre otras cosas, Esto:

$http.Get(serverUrl)
.éxito(función(datos, estado, cabeceras, config) {

var getLinksResponse = datos;

getLinksResponse.value.forEach(función(theResult) {

// y así sucesivamente y así producir espuma

Esto estaba trabajando muy bien en dos diferentes entornos en línea de SharePoint. Sin embargo, Cuando mi colega lo portado a una instancia de Cloudshare, Me estaba poniendo un HTTP 406 error (que fue la primera vez que he tenido esa, Así que... ¡ yay, Creo que sí). Hicimos un poco de investigación y notó que el encabezado de "Aceptar" estaba fuera de. Estaba perfectamente contento con SharePoint online:

Aceptar: application/json

Pero la instancia cloudshare (que es SP en prem, alojado en un servidor virtual) Quería que el clásico "odata = verbose" agregó también en:

Aceptar: application/json;OData = verbose

Para arreglar eso, Hemos añadido la rúbrica como tal:

var config = {cabeceras: {
'Aceptar': ' application/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.éxito(función(datos, estado, cabeceras, config) {

var getLinksResponse = datos;

getLinksResponse.value.forEach(función(theResult) {

// y así sucesivamente y así producir espuma

Que se deshizo de la 406, pero también cambió el formato de la respuesta. Era más... detallado. (jaja!) Más cambios fueron necesarios y aquí está el resultado final:

var config = {cabeceras: {
'Aceptar': ' application/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.éxito(función(datos, estado, cabeceras, config) {

var getLinksResponse = datos;

getLinksResponse.d.results.forEach(función(theResult) {

// y así sucesivamente y así producir espuma

Esto sólo se convirtió en un 30 minuto problema para nosotros, así que suerte. Esperemos que alguien encuentra esta útil.

</final>

Angular es incapaz de arrancar en IE9

Yo he estado jugando con Angular.js para el último mucho tiempo y para la vida de mí, No podría conseguir mis aplicaciones Angular para lanzar en IE9.  Todos trabajan bien en IE11 pero IE9 sólo mostraría las llaves y pedacitos de similares.

Busqué alrededor y no pudo encontrar a nadie quejándose acerca de su problema.  Funcionó bien en Chrome, IE11, No IE9.

Me echaron por el hecho de que la consola IE me daba errores como este:

SEC7111: Seguridad HTTPS está comprometida de res://ieframe.dll/forbidframing.htm

Ese error me había pensando que había algún problema al descargar el angular u otras librerías que necesitaba.  Como resulta, Este no era el problema.

Por husmear los internets, Finalmente descubrí que necesitaba para buscar la frase "bootstrap" y que parecía que estaba fallando el bootstrap.  En el final, mi problema era que yo había decorado mi <HTML> etiqueta con el atributo ng-app, como en:

<HTML ng-app = "MatrixApp">

Bien, Eso no funcionó para IE9.  En su lugar, Envolví todo el resto del HTML en el <cuerpo> dentro de un div y referencias MatrixApp así.

Problema resuelto.

Esperemos que esto ahorra alguien algo de dolor.

</final>

Creciente conciencia / Adopción de Frameworks JavaScript

Mi colega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), escribió un blog Resumen corto en los marcos que le gusta o por lo menos ha estado usando con SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery parece haber sido el vencedor en el campo, por así decirlo, desde hace años, Pero los otros son más nuevos y alambiques luchando contra lo, como Angular. (SPServices, Claro, ha sido un salvavidas durante años y seguirá siendo así creo que).

Lo utilizan personas? Se enfocaron más en herramientas de Microsoft (OMSC / JSOM) o moviendo más hacia Angular, Octavos de final, Ember, etc.?

Tengo un sesgo creciente hacia estos marcos no son de Microsoft. Creo que las cosas MSFT están más difícil y más difícil de trabajar con, que requieren casi tanto de la curva de aprendizaje como al viejo estilo del lado del servidor dev.

Publicar un comentario aquí o en Gran manzana SharePoint Si quieres hablar (Gran manzana tendrán más probabilidad de que una buena discusión).

</final>

Superar problema molesto con las direcciones URL relativas en lanzamiento rápido de SharePoint

Quería añadir un enlace a la navegación de lanzamiento rápido el otro día y me dijo que SharePoint:

image

Versión en texto puro de es:

Asegúrese de que la URL es válida y comienza ya sea con un carácter válido (un signo de número (#) o diagonal (/)) o un protocolo válido de apoyo (por ejemplo, ' http://’, ' https://’, ' archivo://’, ' ftp://’, ' mailto:’, ' noticias:’).

"Blech y pox!"Le dije.

Una solución a esto es utilizar JavaScript para encontrar un vínculo conocido en la puesta en marcha rápida y reemplazar su comportamiento.

Para probar esto, Añadir un nuevo enlace a su sitio de prueba así:

image

He usado jQuery. Para resolverlo, JavaScript y jQuery hasta la página usando su técnica favorita y con una línea de código como esta:

 

$(documento).listo( función () {

    $("un:contiene('Test reemplazo URL')").Haga clic en(función () { alerta("Haga clic en nuevo comportamiento!"); retorno falso;});

});

Y Bob, su tío.

El selector de jQuery se encuentra cada <un> etiqueta que tenga "prueba enlace" en su nombre. Quizá quieras buscar-melodía que dependiendo de su enlace y tal.

El .click(función() reemplaza lo que habría hecho SharePoint cuando el usuario hace clic en. Asegúrese de que usted "return false" o bien se haga su trabajo y luego intentar lo href también, casi seguro que no es su meta.

Esto fue hecho y prueba en un entorno de SharePoint en línea pero debe funcionar bien en 2010 y antes también.

</final>

undefinedSuscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Pobre del almacenamiento en caché en JavaScript

[TL;Versión DR: utiliza cookies para almacenar los resultados de las llamadas asincrónicas; prestar inmediatamente los resultados de las últimas llamadas asincrónicas y validarlos luego después de carga de la página.]

He estado trabajando en sitio de intranet de SharePoint para un cliente que ofrece, entre otras cosas, una estilizada navegación secundaria cuyas opciones del menú se administran mediante una lista personalizada vieja regular.  La idea es que el cliente obtiene al menú de "su" sitio de control sin afectar o ser afectados por la navegación global por lo.

(Hay algo increíblemente subversiva con la adición de un CEWP que apunta a un archivo HTML que carga un CSS y JS fundamentalmente modificar casi todo sobre el comportamiento de un sitio... pero eso es para otro post)

El código para esta bastante simple:

El dolor punto aquí es cada vez que alguien golpea una de las páginas del sitio, navegador del usuario es llegar a obtener elementos de la lista.  Una vez termine la dev y pruebas han demostrado que todo sea estable y completa, esta llamada no es necesaria más de 99% el tiempo desde el menú rara vez cambia.  También tiene un raro efecto UI que es común en este nuevo mundo de sitios web de hiper-ajaxy – hace que la página y sólo entonces hace el menú render.  Es nervioso y distracción en mi punto de vista.  Y nervioso. Por lo tanto, almacenamiento en caché. 

Modifiqué la lógica de esta manera:

  • Busque una cookie en el navegador que contiene el menú como último lo leí
    • Si encuentran, hacerla inmediatamente.  No esperes a terminar de cargar la página.  (Usted necesita para asegurarse de que el código HTML está ubicado estratégicamente aquí, Pero no es difícil de hacer).
  • Esperar a que la página termine de cargar y hacer un async llamar a cargar los elementos de menú de una lista utilizando el resto lists.asmx o lo que sea
  • Comparar lo que tengo contra la cookie
    • Si coincide con, PARADA
    • De lo contrario, utilizando jQuery, rellenar dinámicamente un montón si <Li>está en un <UL>
  • Usar CSS para hacer todo el formato
  • Beneficio!

Algunos de ustedes van a decir, "Hola! no habrá verdadera caché aquí puesto que estás leyendo el menú de todos modos cada vez.”  Y tienes razón, no voy a dar al servidor cualquier tipo de rotura.  Pero porque la llamada asincrónica y ocurre después de la Página inicial carga HTML representa plenamente, "parece" más sensible al usuario.  El menú bastante rinde tanto como la página dibuja.  Si el menú pasa al cambio, el usuario se somete a un nervioso volver a dibujar del menú, Pero sólo una vez.

Hay algunas maneras de hacer más eficaz esta caché y ayudar al servidor al mismo tiempo:

  • Poner en una regla que la caché"cookie" es válida para un mínimo de 24 horas o algunos otros plazos. Mientras no hay ninguna cookie caducada, usar copias instantáneas de menú de la cookie y nunca golpeó el servidor.

Bueno... eso es lo que vienen a la mente ahora :). 

Si alguien tiene alguna idea inteligente aquí me encantaría conocerlos.

Y por último – esta técnica puede utilizarse para otras cosas.  Página de mi cliente tiene un número de cosas basadas en datos de varias páginas, muchos de ellos cambiando relativamente raramente (como una vez por semana o una vez al mes).  Si destino áreas específicas de la funcionalidad, Puedes darle una interfaz de usuario más sensible tirando de contenido de la tienda local de galleta y procesamiento inmediato.  Se siente más rápido para el usuario incluso si no estás salvando el servidor cualquier ciclos.  Te puede Guarde los ciclos del servidor por decidir sobre algunas condiciones y disparadores para invalidar esta caché local cookie.  Eso es todo situacional artístico y verdad lo más divertido :). 

</final>

undefinedSuscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin