Cómo especificar la gente como un ámbito de búsqueda / Fuente del contenido mediante SharePoint 2013 API REST

Tenía razón para trabajar con el SharePoint 2013 API de búsqueda por medio de descanso por primera vez. Quería buscar personas, no documentos. La clave de aprendizaje aquí es que especifique las fuentes de contenido a través de su GUID (o por lo menos en este caso). El siguiente fragmento de código jQuery se muestra cómo:

    loadExpertsAsync: función() {

        jQuery.support.cors = verdadero;

        $.Ajax({
            URL: Esto.CreateFullApiUrl() +
                "?QueryText = 'portales'&sourceid = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'" +
                "&selectproperties ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Habilidades,Acerca de mi,Intereses,JobTitle,PastProjects,PictureURL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&ROWLIMIT = 99",
            método: "Obtener",
            cabeceras: { "Aceptar": "application/json; OData = verbose" },
            caché: falso,
            éxito: función (resultado) {

En mi caso, Estoy compitiendo la API con SharePoint online. Para obtener el GUID, He seguido estos pasos:

  1. Acceso al centro de administración de SharePoint
  2. Seleccione "Buscar" de la mano izquierda de navegación
  3. Seleccione "Administrar fuentes resultado"
  4. Seleccione "Resultados de la población Local"
  5. Mira la URL.

Parecía un poco a mi URL:

https://xyzzy-admin.sharepoint.com/_layouts/15/searchadmin/EditResultSource.aspx?level=tenant&sourceid=b09a7990%2D05ea%2D4af9%2D81ef%2Dedfab16c4e31&view=1

El parámetro sourceid es lo que funcionó para mí.

(Entiendo que el sourceid puede realmente ser una especie de permanente con SP, pero siempre a comprobar todos modos 🙂 ).

</final>

undefinedSuscribirse a mi blog.

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

Ejemplo SharePoint resto llamadas

Aquí hay un conjunto de llamadas a resto muestra que funciona para mí y puede ayudarte, así. Como de 02/2014, hay dos ejemplos 🙂

  1. Referencia a una columna con espacios en su nombre
  2. Referencia a una columna de selección múltiple
  3. Realizar una búsqueda de personas vía resto

 

Agregaré a esto conforme pasa el tiempo.

Aquí están algunas tintas útiles que he encontrado así como:

Referencia a una columna con espacios en su nombre

Crear una lista personalizada con una columna denominada a "Autor del Blog" (espacio entre el Blog y autor).

El $select para hacer referencia a esa columna es:

image

Simplemente reemplace el espacio con "_x0020_". Vemos el _x0020_ en muchos ejemplos a través de la Internet y el resto no es diferente.

Si no haces eso, es probable que un error como este:

La expresión “Autor del blog” No es válido.

Bastante fácil.

Referencia a una columna de búsqueda selección múltiple

Configurar:

  1. Crear una lista personalizada denominada categorías.
  2. Añadir algunas categorías. He añadido categorías así:image
  3. Crear otra lista personalizada denominada MockBlog y Añadir categorías como una columna de lista de selección múltiple (o columna de sitio si es cómo tiras).

Agregar algunos elementos a la lista de Mockblog y estás listo.

Una llamada de estilo Ajax usando jQuery se verá algo como esto:

serverUrl  = "/_api/web/listas/GetByTitle('MockBlog')/artículos" +
             "?$Seleccione = Title,Categorías/título,Blog_x0020_Author/título" + 
             "&$ampliar = Blog_x0020_Author,Categorías";

Estamos contando SharePoint "Dame el título para todas las categorías (Categorías/título). Obtener los valores reales para Título por $ampliarIng la lista categorías." (Parafraseando a mi descanso es probablemente bastante flojo, Pero cómo estoy interpretando).

Si lo haces vía JavaScript y usando Fiddler para mirar la salida, a cambio tienes algo como esto:

 

image

(Lo anterior es un objeto JSON)

Realizar una búsqueda de personas vía resto

Lo escribió en su blog acerca de esto por separado. La clave consiste en especificar un parámetro sourceid cuyo valor es el GUID de la fuente de contenido de gente Local. (Fuentes de contenido solían llamarse alcances y es oh-mi tanto por no llamarlo todo un ámbito para mí!).

Lea más sobre ello aquí: http://www.mstechblogs.com/paul/?p=10385

 

</final>

undefinedSuscribirse a mi blog.

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

Fácil y rápida: Crear un sitio de SharePoint usando resto

Hay un montón de recursos mostrar cómo hacerlo, Pero no pude encontrar un enlace acudir integral, Así que aquí estamos.

Puede crear un sitio de SharePoint usando la API de REST.  Aquí hay un ejemplo totalmente al horno:

<!--
    SiteRequestForm.html: Recopilar información y crear un sitio para el usuario.
-->

<Centro>
<mesa>
    <TR>
        <TD>Nombre del sitio:</TD>
        <TD><entrada tipo= "text" nombre"SiteName =" ID."SiteName =" /></TD>
    </TR>
    <TR>
        <TD colspan= "2">
            <entrada tipo= "enviar" ID.= CreateSiteButton"" valor= "Crear el sitio" />
        </TD>
    </TR>
</mesa>
</Centro>

<secuencia de comandos src="../Plugins/jQuery-1.11.0.min.js"></secuencia de comandos>

<secuencia de comandos>
var CreateSiteLogicContainer = {

    createSiteData: {
            "los parámetros": {
                __metadata: { "tipo": "SP.WebInfoCreationInformation" },
                URL: "Paultest1",
                Título: "Paultest1",
                Descripción: "resto-creado web por Pablo!",
                Idioma: 1033,
                WebTemplate: "sts",
                UseUniquePermissions: falso
            }
    },

    createSite: función () {

        jQuery.support.cors = verdadero;

        CreateSiteLogicContainer.createSiteData.parameters.Url = $("#SiteName").Val();
        
        $.Ajax({
            URL: "https://bigapplesharepoint.sharepoint.com/NBAIADev/_api/web/webinfos/add",
            método: "EL POST",

            cabeceras: {
                "Aceptar": "application/json; OData = verbose",
                "content-type": "application/json;OData = verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").Val()
            },

            datos: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            éxito: función () { alerta("el éxito"); },
            error: función () { alerta("error"); }

        });
    },

    wireUpForm: función () {
        $("#CreateSiteButton").Haga clic en(función () {
            alerta("A punto de probar y crear el sitio.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</secuencia de comandos>

Cuando exitoso, obtienes un paquete JSON en respuesta así:

image

Mis pensamientos claves y aprendizajes de esta inclusión:

  • Este enfoque utiliza jQuery.  En mi caso, mi biblioteca jQuery se encuentra en ".../ plugins. "  Usted querrá cambiar eso para señalar su lugar favorito de JQ.
  • Puede copiar y pegar ese fragmento entero en un elemento Web Editor de contenido en una página y debería funcionar bien.  Usted querrá cambiar el punto final de la llamada de API y asegúrese de que usted referencia JQ correctamente.
  • La URL es relativa a punto final de su API.  En mi caso, es crear subsitios debajo https://bigapplesharepoint.com
  • No es necesario proporcionar una longitud del contenido. Algunas entradas en el blog y MSDN documento implica que hacer, Pero pasó por mí automáticamente, que supongo que está siendo manejado por la llamada .ajax $ sí mismo.
  • Esta línea es necesaria para evitar una respuesta "prohibida": "X-RequestDigest": $("#__REQUESTDIGEST").Val().  Hay otras maneras de hacerlo, Pero esto es muy bonito.  He perdido el enlace al blog que proporcionan este acceso directo.  H/T te, misterioso blogger!

Buena suerte y espero que esto ayude a alguien.

</final>

undefinedSuscribirse a mi blog.

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

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

Rápida y sencilla: SharePoint resto llamar sólo devuelve 100 Registros

Yo he estado trabajando en un sitio web orientada al público para mi práctica en SharePoint Nueva York y usa un montón de llamadas JavaScript y resto para mostrar contenido.

Durante el desarrollo principal, Sólo se crea un pequeño conjunto de datos con 10 o así las filas de una lista personalizada y mis llamadas de resto todo tiraron desde allí.  Una vez me encontré la lista para tener unas cien filas de datos para pruebas de crecimiento esperado, Encontré que estaba recibiendo exactamente 100 filas devueltas en mis llamadas resto.

Esto es una cosa muy simple a la dirección.  En mi caso (y yo creo en la mayoría de los casos), el valor predeterminado resto llamadas a SharePoint (y posiblemente como un estándar del sector?) retorno 100 filas.  Para volver más que el valor por defecto, Utilice el parámetro $top en tu llamada, como en:

OBTENER /Insights Dev/_api/web/lists/GetByTitle('MockBlog')/artículos?$Seleccione ID =,Título,Categorías/título,Blog_x0020_Author/título,DatePublished,BlogSummary&$ampliar = Blog_x0020_Author,Categorías&$filtro =&$Top = 9999

Elegí 9999 en este caso puesto que sé growth-wise, No habrá más 200 o tan filas agregar a esta lista en un año.  Si se vuelve lento, podemos implementar una paginación en el camino.

</final>

undefinedSuscribirse a mi blog.

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

Rápida y sencilla: Resolver "parámetro de URL no válida” problema con UpdateListItems en lists.asmx

Cuando se trabaja con UpdateListItems vía lists.asmx, es fácil generar el error:

Parámetro de URL no válida.

La URL proporcionada contiene un comando no válido o valor. Por favor comprueba la URL otra vez.

Usted puede conseguir este error cuando se olvida de incluir ID en la la lista de campos para actualizar.  Esto, como muchos de estos SP servicios web, es un poco ilógica puesto que es necesario incluir el ID en el atributo ID de la <Método> elemento.  Y no estás actualizado ID y probablemente nunca quiero en primer lugar.

Este sobre jabón funciona:

<soapenv:Xmlns envolvente:soapenv =' http://schemas.xmlsoap.org/SOAP/Envelope/'>
  <soapenv:Cuerpo>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <actualizaciones>                     
         <Lote OnError ="Continuar">
          <Método ID ="1" Cmd ="Update">
            <Nombre del campo ="CooperativeLock">bloqueado!</Campo>
            <Nombre del campo ="ID">1</Campo>
          </Método>
        </Lote>                     
        </actualizaciones>                
      </UpdateListItems>             
  </soapenv:Cuerpo>         
</soapenv:Envolvente>

Si tiras a la referencia del campo ID entonces obtendrás el molesto mensaje "Parámetro de URL no válida".

</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

Cómo: Configurar prueba unitaria y cobertura de la prueba con QUnit.js y Blanket.js para una oficina 365 Aplicación de SharePoint

Intro

Me han estado explorando pruebas unitarias y cobertura de prueba para JavaScript como trabajo en una nueva aplicación de SharePoint para SharePoint en línea en la oficina 365 Suite.  Los caminos de investigación obvio me llevaron a Qunit.js y justo después, Para Blanket.js.

QUnit Déjame crear pruebas unitarias y agruparlas en módulos.  Un módulo es una manera simple de organizar pruebas relacionadas. (No sé si que lo estoy usando como se pretendía, Pero está funcionando para mí hasta ahora con el pequeño conjunto de pruebas que hasta el momento he definido).

Blanket.js se integra con Qunit y me mostrará las líneas reales de JavaScript que eran – y lo más importante – no fueron realmente ejecutadas en el transcurso de las pruebas.  Esta es "la cobertura" – líneas que ejecutan están cubiertas por la prueba mientras que otras no lo son.

Entre establecer buenos casos de prueba y visualización de cobertura, podemos reducir el riesgo de que nuestro código ha ocultado defectos.  Buenos tiempos.

Qunit

Suponiendo que tienes tu Visual Studio proyecto establecido, empezar descargando el paquete de JavaScript desde http://qunitjs.com.  Añadir el JavaScript y CSS correspondiente a su solución.  Mina se parece a esto:

image

Figura 1

Como se puede ver, Estaba usando 1.13.0 en el momento que escribí esta entrada de blog. No te olvides de descargar y agregar el archivo CSS.

Fuera del camino, siguiente paso es crear una especie de prueba del arnés y los bits de Qunit de referencia.  Estoy probando un montón de funciones en un archivo de script llamado "QuizUtil.js" así que he creado una página HTML llamada "QuizUtil_test.html" como se muestra:

image Figura 2

Aquí está el código:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<cabeza>
    <Título>QuizUtil prueba con Qunit</Título>
    <enlace REL= "stylesheet" href="../CSS/qunit-1.13.0.CSS" />
    <secuencia de comandos tipo= text/javascript"" src="QuizUtil.js" datos de la cubierta></secuencia de comandos>
    <tipo de script ="text/javascript" src ="qunit-1.13.0.js"></secuencia de comandos>
    <tipo de script ="text/javascript" src ="blanket.min.js"></secuencia de comandos>

    <secuencia de comandos>
        módulo("getIDFromLookup");
        prueba("QuizUtil getIDFromLookupField", función () {
            var goodValue = "1;#Paul Galvin";

            igual(getIDFromLookupField(goodValue) + 1, 2), "ID de [" + goodValue + "] + 1 debe ser de 2";
            igual(getIDFromLookupField(undefined), undefined, "Undefined argumento de entrada debe devolver resultado indefinido.");
            igual(getIDFromLookupField(""), undefined, "Argumento de entrada vacío debe devolver un valor no definido.");
            igual(getIDFromLookupField("gobbledigood3-thq;ada dkvn;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), undefined,"Debería volver un convertible de resultado a un entero");
            igual(getIDFromLookupField("2;#alguna otra persona"), "2", "Checking [2;#alguna otra persona].");
            igual(getIDFromLookupField("9834524;#valor de tipo Long"), "9834524", "Prueba de gran valor.");
            SqlDouble(getIDFromLookupField("5;#Nadie", 6), 6, "Prueba de un SqlDouble (5 No es igual a 6 para este ejemplo: [5;#Nadie]");

        });

        módulo("htmlEscape");
        prueba("QuizUtil htmlEscape()", función () {
            igual(htmlEscape("<"), "&lt;", "Escape a menos de operador ('<')");
            igual(htmlEscape("<div class =  "someclass">Parte del texto</div>"), "&lt;div class =&quot;SomeClass&quot;&gt;Parte del texto&lt;/div&gt;", "La secuencia de prueba más compleja.");
        });

        módulo("getDateAsCaml");
        prueba("QuizUtil getDateAsCaml()", función () {
            igual(getDateAsCaml(Nuevo Fecha("31/12/2013")), "2013-12-31T:00:00:00", "Testing fecha duro codificado: [12/31/2013]");
            igual(getDateAsCaml(Nuevo Fecha("01/05/2014")), "2014-01-05T:00:00:00", "Testing fecha duro codificado: [01/05/2014]");
            igual(getDateAsCaml(Nuevo Fecha("01/31/2014")), "2014-01-31T:00:00:00", "Testing fecha duro codificado: [01/31/2014]");
            igual(getTodayAsCaml(), getDateAsCaml(Nuevo Fecha()), "getTodayAsCaml() debe ser igual a getDateAsCaml(nueva fecha())");
            igual(getDateAsCaml("valor de tonterías"), undefined, "Tratar de obtener la fecha de un valor de tonterías.");
            igual(getDateAsCaml(undefined), undefined, "Tratar de obtener la fecha de la [undefined] fecha.");
        });

        módulo("getParameterByName");
        prueba("QuizUtil getParameterByName (de la cadena de consulta)", función () {
            igual(getParameterByName(undefined), undefined, "Tratar de conseguir parámetro definido debe devolver indefinido.");
            igual(getParameterByName("no existe"), undefined, "Tratar de obtener el valor del parámetro cuando sabemos que no existe el parámetro.");

        });

        módulo(Cookies"");
        prueba("QuizUtil varias funciones de la galleta.", función () {
            igual(setCookie("prueba de", "1", -1), getCookieValue("prueba de"), "Conseguir una galleta puse debería funcionar.");
            igual(setCookie("anycookie", "1", -1), verdadero, "Establecer una cocción válido debe devolver 'true'.");
            igual(setCookie("nombre de la cookie loco !@#$%"%\^&*(()?/><.,", "1", -1), verdadero, "Establecer un nombre de la cookie mal debe devolver 'falso'.");
            igual(setCookie(undefined, "1", -1), undefined, "Paso definido como el nombre de la cookie.");
            igual(getCookieValue("no existe"), "", "Cookie no existe prueba.");
        });

    </secuencia de comandos>
</cabeza>
<cuerpo>
    <div ID.= "qunit"></div>
    <div ID.= "qunit-fixture"></div>

</cuerpo>
</HTML>

Hay varias cosas que pasan aquí:

  1. Mi código de referencia (QuizUtil.js)
  2. Referencia Qunity.js
  3. Definir algunos módulos (getIDFromLookup, "Cookies", y otros)
  4. Colocar un <div> cuyo ID es "qunit".

A continuación, Sólo hago esta página y obtienes algo como esto:

image

Figura 3

Si te ves en la parte superior, Tienes varias opciones, dos de los cuales son interesantes:

  • Ocultar pruebas pasado: Bastante obvio.  Puede ayudar el ojo a ver las áreas problemáticas y no un montón de desorden.
  • Módulo: (menú desplegable): Esto filtrará las pruebas a esos grupos de pruebas que quieres.

En cuanto a las pruebas de sí mismos – unos comentarios:

  • Hace falta decir que tienes que escribir el código que es comprobable en primer lugar.  Usando la herramienta puede ayudar a hacer cumplir esa disciplina. Por ejemplo, Tenía una función llamada "getTodayAsCaml()”.  Esto no es muy comprobable desde no toma ningún argumento de entrada y para probarlo por la igualdad, Necesitamos actualizar constantemente el código de prueba para reflejar la fecha actual.  Yo lo refactorizado por adición de un parámetro de entrada de datos y luego pasar la fecha actual cuando quiera la fecha actual en formato CAML.
  • El marco Qunit documenta sus propias pruebas y parece bastante robusto.  Puede hacer cosas simples como prueba para la igualdad y también tiene soporte para llamadas de estilo ajax (tanto "real" o escarnecido usando tu favorito mocker).
  • El proceso también te obliga a pensar en casos de borde – ¿qué pasa con "indefinido" o nulo se pasa a una función.  Resulta muerto simple probar estos escenarios hacia fuera.  Muy bueno.

Cobertura con Blanket.js

Blanket.js complementa Qunit mediante el seguimiento de las actuales líneas de código que se ejecutan durante el curso de sus pruebas.  Integra el derecho en Qunit así que aunque es una aplicación totalmente independiente, juega muy bien, parece que es una aplicación perfecta.

Esto es blanket.js en acción:

image Figura 4

image

Figura 5

(Tienes que hacer clic en la casilla "Habilitar la cobertura" en la parte superior [ver figura 3] para permitir esto.)

Las líneas resaltadas en la figura 5 No han sido ejecutados por cualquiera de mis pruebas, Tengo que diseñar una prueba que hacen que se ejecutarán si quiero cobertura completa.

Conseguir trabajo siguiendo estos pasos blanket.js:

  1. Descargar de http://blanketjs.org/.
  2. Añádelo a tu proyecto
  3. Actualizar la página de mazo de cables de prueba (QuizUtil_test.html en mi caso) como sigue:
    1. El código de referencia
    2. Decorar tu <secuencia de comandos> referencia así:
    <secuencia de comandos tipo= text/javascript"" src="QuizUtil.js" datos de la cubierta></secuencia de comandos>

Blanket.js recoge el atributo "data-cubierta" y hace su magia.  Se conecta a Qunit, actualiza la interfaz de usuario para agregar la opción "Habilitar la cobertura" y listo!

Resumen (TL; DR)

Utilizar Qunit para escribir sus casos de prueba.

  • Descargar
  • Añádelo a tu proyecto
  • Escribir una página de prueba de arnés
  • Crear tus pruebas
    • Refactorizar algunas de tu código para ser comprobable
    • Ser creativo!  Creo que de locos, escenarios imposibles y ponerlas a prueba de todos modos.

Blanket.js de uso para asegurar una cobertura

  • Asegúrese de que está trabajando Qunit
  • Descargar blanket.js y agregarla a su proyecto
  • Agregar a la página de mazo de cables de prueba:
    • Agregue una referencia a blanket.js
    • Agregar un atributo "datos-cubierta" para su <secuencia de comandos> etiqueta
  • Ejecutar las pruebas Qunit.

Nunca hice nada de esto antes y tenía algo rudimentario en un puñado de horas de trabajo. 

Prueba feliz!

</final>

undefinedSuscribirse a mi blog.

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

El último traje que usted usará cada vez?

[Rápida NOTA – Este es un post bastante largo en un trabajo para mi grupo aquí en Nueva York y que necesitas para vivir en el área de tri-state si usted está interesado.]

Me uní a Slalom Consulting sobre 18 hace meses y que esto hace mi trabajo más larga duración desde 2007. No planeamos así. Antes de una cadena de trabajo salto comenzó con mi salto en el mundo de SharePoint, Yo estaba en un lugar durante once años. Finalmente he encontrado un nuevo, duradera para trabajar a largo plazo aquí en Slalom.

Este lugar está creciendo y necesito ayuda para controlar. El tipo de ayuda que necesito generalmente se llama a un "arquitecto de soluciones de SharePoint" aunque he encontrado de arquitecto se utilice la palabra más o incorrectamente en el espacio de SharePoint desde hace bastante tiempo ahora. Yo he estado luchando en su blog acerca de esto. No quiero simplemente lista a un montón de puntos en el estilo de dados/Monster. Mis compañeros de reclutamiento excelentes han estado haciendo ya :). Por lo tanto, Decidí tomar un enfoque de "día en la vida". Leer y considerar:

1) Si apela y

2) Si sabes en los huesos que puede hacerlo.

En caso afirmativo, entrarme en contacto con (Paul.Galvin@slalom.com) y hablemos.

Se trata de lo que puede esperar en la típico semana/mes como un arquitecto de soluciones en mi equipo:

  • Ejecución de proyectos, a menudo más de uno en uno. Algunos proyectos son grandes y por lo tanto tienes un proyecto. "En marcha" un proyecto significa que tiene supervisión y responsabilidad de la calidad de la entrega. En casi todos los casos tendrá un PM y un fuerte equipo de desarrolladores, COCHE, Gente UX, etc.., para apoyarle. Pero usted será la cara principal que el cliente ve, Fideicomisos, etc.. No hay escondido en las sombras en este papel :). Te procesas esta vez y el objetivo es mantenerte ocupado de ello 80 por ciento del tiempo.
  • Ayuda con el papeleo, cerdas, RFP, cubiertas – todo lo que bueno. Creo que tenemos nuestro proceso de puerca bastante apretado y sólida por lo que es bastante exhaustivas. Si estás acostumbrado a escribir hoy cerdas, nuestro proceso no va a ser un desafío para usted. RFP – son un poco más difíciles. Tienden a ser medida en la naturaleza para comenzar con y RFPs típicamente tiran de múltiples autores diferentes. Es bueno y malo, pero sobre todo bueno. Esto puede ser scrambly cuando tenemos que hipotecar para excelente servicio al cliente al mismo tiempo tratando de ganar nuevos trabajos. Probablemente no tienes un RFP, pero le pedirá a contribuir con secciones.
  • Llamadas de ventas, pero no más. En el curso de un mes, Usted puede esperar en un par de llamadas de ventas con nuestro equipo de ventas. Serás el SME en la habitación, tomar notas y ayudar a la solución de la forma. Sin embargo, no pide ni espera que el ciclo de ventas de principio a fin. Usted no necesita "vender,"Basta de ser la voz calma de la razón experto en la sala de. Esto construye confianza y por eso estás allí. Claro, Si te gusta la venta, entonces hay espacio para que usted pueda crecer aquí también.
  • Ayuda con el reclutamiento. ¿Tienen algún tipo de programa de referidos, así que si sabes realmente gente fuerte en la comunidad que cree que debe ser parte de Slalom, Usted puede beneficiarse de esa manera. Hemos dedicado los reclutadores (que son excelentes) para hacer parte la mayor de este tipo de trabajo. La ayuda real es entrevistar a candidatos – son un buen ajuste cultural? ¿Saben sus cosas? Pueden hacer * mi * la vida más fácil? 🙂 Esto viene a borbotones, un par de veces al mes, Aunque en algunos meses no haría nada.
  • Ayudar a definir las mejores prácticas, construir nuestra IP y hacernos más competitivos en el mercado. Eres una chico experimentada/gal. Usted ha estado alrededor de la manzana, no sólo en SharePoint, pero usted tiene experiencia en otras tecnologías y vivido buenos y malos (incluso terrible) proyectos en todas partes. Como un resultado, Sabes lo que funciona y lo que no. Te queremos compartir esa experiencia con nosotros en un día a día en un sentido táctico (i.e. ejecutar sus proyectos muy bien) pero también estratégicamente. "Mejores prácticas" es un poco sobreutilizadas como un término y no me atrevo a usarlo. La idea básica es que vienes como una persona con experiencia con experiencia profunda y relevante y queremos integrar lo mejor de sus aprendizajes en cómo nos comprometemos con los clientes en el día a día.
  • Que te diviertas – Somos un grupo muy integrado. Quiero evitar otro tópico, pero en este caso es realmente apt – trabajamos duro (tipo de) y jugamos aún más difícil :). Hay una especie de Aaron Sorkin de bromas aquí, la sala está siempre llena de gente inteligente, nos gusta nuestra bebida y organizamos un buen número de divertidos eventos – noche de película, viajes de béisbol (Aunque sean horrible, equipos prácticamente malos).

Si yo pude resumir todo en una sola palabra, Yo usaría la palabra "liderazgo". Liderar proyectos, tomar un papel protagónico en la construcción de la práctica (IP, el equipo de construcción), etc..

Pero esperar! Hay más! ¿Por qué trabajar en Slalom?

  • Notable unidad de intenciones – todo el mundo quiere crecer esta cosa hacia fuera. "Esta cosa" es la oficina de Nueva York. Todo el mundo está a bordo con este.
  • Viento en tus velas – hermana oficinas, hermana practica – Slalom es un "servicio completo" consultoría de organización. Yo dirijo la práctica de SharePoint (una "práctica área de plomo" en la jerga del Slalom). Tengo hermana prácticas en 11 otras oficinas de Slalom. Así que a pesar de que yo soy rey por lo que SharePoint se refiere aquí en Slalom Nueva York, Tengo prácticas entre pares en Chicago, Seattle, Dallas, Atlanta, Boston, etc.. de que puedo aprovechar apoyo. Realmente es lo mejor de ambos mundos – autonomía significativa aquí en Nueva York pero acceso a toneladas de talento en toda la organización.
  • Viento en sus ventas (2) – Que hacemos más de SharePoint – mucho más. Hacemos BI, CRM, UX, Consultoría de negocios, Mobile, desarrollos a medida y otros. Somos buenos en Cruz venta entre nosotros mismos y somos buenos en la pintura – y lo más importante, entrega a – una imagen de "servicio completo" para nuestros clientes. Esto es especialmente atractivo para mí. He estado en muchas organizaciones más pequeñas trabajando en conciertos de SharePoint y frustrado una y otra vez porque estábamos Paloma escondido como el "pueblo de SharePoint". Eso no ocurre con el Slalom y llegamos a hacer el trabajo más interesante como resultado.
  • Modelo local – no viajes.
  • Crecimiento a largo plazo – Slalom ha ido frenética. Montón de crecimiento y estabilidad. Crecimiento también significa que necesitamos contratar líderes hoy para dirigir nuevos equipos como agregamos más clientes y personal para apoyar a los clientes.

Podría seguir, pero probablemente ya he ido mucho tiempo. Creo que he captado la esencia aquí. Si estás pensando en cambiar de puestos de trabajo y esto se ve bien a usted, Let's talk.

Si eres feliz en su trabajo actual – hablemos de todos modos :). He estado en muchos lugares y era muy "feliz" en el momento. Slalom es diferente y me agradaría una oportunidad para convencerte de.

</final>

undefinedSuscribirse a mi blog.

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

Fácil y rápida: Definir el tamaño de un elementos en un cuadro de lista en una aplicación de Windows Store

Estoy creando en un Windows App Store, Quiero mostrar al usuario diversos mensajes informativos.  Elegí un ListBox como la herramienta para mostrar así pueden desplazarse por ellas y las buenas cosas. 

Los mensajes son sólo informativos, Así que no hay necesidad para proporcionar espacios todo alrededor de ellos puesto que el usuario nunca puede seleccionarlos para nada.  El comportamiento predeterminado del cuadro de lista proporciona una cantidad sustancial de relleno y que quería deshacerse de él.  Bueno.... No puedes hacer a ese tipo de cosas en el cuadro de lista directamente.  SIN EMBARGO, Puedes hacerlo para agregar los elementos:

        privada void AddGameStateLogMessage(cadena Mensaje)
        {
            TextBox t = Nuevo Cuadro de texto();
            t.Text = GameStateCounter    + ": " + Mensaje;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Grueso thisPadding = Nuevo Grueso(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = Nuevo ListBoxItem();
            Li.Contenido = t;
            Li.MaxHeight = 25;
            thisPadding = Nuevo Grueso(5, 0, 5, 0);
            Li.Relleno = thisPadding;

            GameStateLog.Items.Insert(0,Li);
        }

en el anterior, Estoy creando un cuadro de texto y establecer su fuente, su relleno, etc..

Siguiente, Crear un ListBoxItem y establece su contenido en el cuadro de texto con formato.

Finalmente, El ListBoxItem se coloca en el cuadro de lista.  (Quiero mostrar los mensajes más recientes en la parte superior de la lista, por lo tanto, la inserción(0,Li) en lugar de un simple complemento() invocación.).

Va estar afinando esta un poco antes de que estoy muy contento con el comportamiento de ListBox pero el patrón mostrado arriba ha sido muy fructífero.  Espero que alguien lo encuentra útil.

</final>

undefinedSuscribirse a mi blog.

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