Como especificar as pessoas como um escopo de pesquisa / Fonte de conteúdo usando o SharePoint 2013 API REST

Tinha motivo para trabalhar com o SharePoint 2013 API de pesquisa através de resto pela primeira vez. Eu queria procurar pessoas, Não de documentos. A chave aprender aqui é que você especificar conteúdas fontes via seu GUID (ou, pelo menos neste caso). O trecho a seguir jQuery mostra como:

    loadExpertsAsync: função() {

        jQuery.support.cors = verdadeiro;

        $.Ajax({
            URL: Isso.CreateFullApiUrl() +
                "?QueryText = 'portais'&SourceID = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'" +
                "&selecione Propriedades ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Habilidades,AboutMe,Interesses,JobTitle,PastProjects,PictureURL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&RowLimit = 99",
            Método: "Obter",
            cabeçalhos: { "Aceitar": "application/json; OData = verbose" },
            cache: falso,
            sucesso: função (resultado) {

No meu caso, Estou concorrendo a API contra SharePoint online. Para obter o GUID, Eu segui estes passos:

  1. Acessar a central do administrador do SharePoint
  2. Selecione "Pesquisar" de navegação a mão esquerda
  3. Selecione "gerenciar fontes de resultado"
  4. Selecione "Resultados da população Local"
  5. Olhe a URL.

Parecia a minha URL:

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

O parâmetro sourceid é o que funcionou para mim.

(Eu entendo que o sourceid pode realmente ser um tipo de coisa permanente com SP, mas eu vou sempre verificar qualquer maneira 🙂 ).

</fim>

undefinedSubscreva ao meu blog.

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

Exemplo do SharePoint resto chamadas

Aqui é um conjunto de chamadas de resto de amostra que trabalha para mim e pode ajudá-lo também. A partir de 02/2014, existem dois exemplos

  1. Referência a uma coluna com espaços em seu nome
  2. Referência a uma coluna de seleção múltipla
  3. Realizar uma pesquisa de pessoas através do resto

 

Vou acrescentar a isto como o tempo passa.

Aqui estão algumas tintas úteis que encontrei também:

Referência a uma coluna com espaços em seu nome

Criar uma lista personalizada com uma coluna chamada "Autor do Blog" (espaço entre o Blog e autor).

O $select para fazer referência a essa coluna é:

image

Basta substituir o espaço com "_x0020_". Vemos o _x0020_ em muitos exemplos em toda a Internet e o resto não é diferente.

Se você não faz isso, é capaz de receber uma mensagem de erro assim:

A expressão “Blog do autor” Não é válido.

Bastante fácil.

Referência a uma coluna de pesquisa múltipla seleção

Configurar:

  1. Criar uma lista personalizada chamada categorias.
  2. Adicionar algumas categorias. Eu adicionei categorias desta forma:image
  3. Criar outra lista personalizada chamada MockBlog e adicionar categorias como uma coluna de lista de seleção múltipla (ou coluna do site se você assim).

Adicionar alguns itens à sua lista de Mockblog e você está pronto.

Uma chamada de estilo Ajax utilizando jQuery será parecido com isto:

  = serverUrl "/_api/web/listas/GetByTitle('MockBlog')/itens" +
             "?$Selecione = título,Categorias/título,Blog_x0020_Author/título" + 
             "&$expandir = Blog_x0020_Author,Categorias";

Vamos contar SharePoint "dá-me o título para todas as categorias (Categorias/título). Obter os valores reais para Título por $expandira lista de categorias ing." (Meu parafraseando RESTful é provavelmente muito solto, Mas isso como eu estou interpretando-).

Se você estiver fazendo isso via JavaScript e usando o Fiddler para olhar para a saída, Você recebe algo como isto em troca:

 

image

(O acima é um objeto JSON)

Realizar uma pesquisa de pessoas através do resto

Eu postei sobre isso separadamente. A chave é para especificar um parâmetro sourceid cujo valor é o GUID da fonte de conteúdo Local pessoas. (Fontes de conteúdo costumavam ser chamado de escopos e Ah-meu tanto para ligar tudo um escopo para mim não é!).

Leia mais sobre ele aqui: http://www.mstechblogs.com/paul/?p=10385

 

</fim>

undefinedSubscreva ao meu blog.

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

Rápido e fácil: Criar um Site do SharePoint usando o resto

Há um monte de recursos em torno do que mostram como fazer isso, Mas não consegui encontrar um link abrangente que, Então, aqui estamos....

Você pode criar um site do SharePoint usando a API REST.  Aqui está um exemplo totalmente cozido:

<!--
    SiteRequestForm.html: Coletar informações e criar um site para o usuário.
-->

<Centro>
<tabela>
    <TR>
        <TD>Nome do site:</TD>
        <TD><entrada tipo= "texto" nome= "NomeDoSite" ID= "NomeDoSite" /></TD>
    </TR>
    <TR>
        <TD ColSpan= 2"">
            <entrada tipo= "submit" ID= "CreateSiteButton" valor= "Criar o Site" />
        </TD>
    </TR>
</tabela>
</Centro>

<script src="../Plugins/jQuery-1.11.0.min.js"></script>

<script>
var CreateSiteLogicContainer = {

    createSiteData: {
            "parâmetros": {
                __metadata: { "tipo": "SP.WebInfoCreationInformation" },
                URL: "Paultest1",
                Título: "Paultest1",
                Descrição: "web resto-criado por Paul!",
                Língua: 1033,
                WebTemplate: "sts",
                UseUniquePermissions: falso
            }
    },

    createSite: função () {

        jQuery.support.cors = verdadeiro;

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

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

            dados: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            sucesso: função () { alerta("o sucesso"); },
            erro: função () { alerta("erro"); }

        });
    },

    wireUpForm: função () {
        $("#CreateSiteButton").Clique em(função () {
            alerta("Prestes a experimentar e criar o site.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</script>

Quando bem sucedida, se um pacote JSON em resposta assim:

image

Meus pensamentos chaves e aprendizados desta incluem:

  • Essa abordagem usa jQuery.  No meu caso, minha biblioteca jQuery situa-se em ".../ plugins. "  Você vai querer mudar isso para seu local favorito de JQ.
  • Você pode copiar e colar o trecho inteiro em uma Web Part do Editor de conteúdo em uma página e deve funcionar bem.  Você vai querer mudar o ponto de extremidade da chamada de API e certifique-se de que fazer referência JQ corretamente.
  • O URL é relativo para o ponto de extremidade de sua API.  No meu caso, é criar subsites por baixo https://bigapplesharepoint.com
  • Você não precisa fornecer um conteúdo-comprimento. Alguns posts e MSDN documento implica que você faz..., Mas aconteceu-me automaticamente, que presumo que está sendo manipulado pela chamada AJAX $ em si.
  • Esta linha é necessária para evitar uma resposta de "proibida": "X-RequestDigest": $("#__REQUESTDIGEST").Val().  Existem outras maneiras de fazê-lo, Mas isso é muito bom.  Eu perdi o link para o blog que forneceu este atalho.  H/T para você, blogueiro misterioso!

Boa sorte e espero que isso ajude alguém.

</fim>

undefinedSubscreva ao meu blog.

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

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

Rápido e simples: SharePoint resto chamar só retorna 100 Registros

Tenho trabalhado em um site público enfrentam para a minha prática de SharePoint aqui em Nova Iorque e ele usa um monte de chamadas JavaScript e o resto para mostrar o conteúdo.

Durante o desenvolvimento da linha principal, Criar um pequeno conjunto de dados com apenas 10 ou então linhas em uma lista personalizada e todas as minhas chamadas de resto tirou de lá.  Uma vez eu cruzei a lista para ter umas 100 linhas de dados para testar para o crescimento esperado, Eu achei que eu estava ficando exatamente 100 linhas retornadas na minhas chamadas REST.

Isso é uma coisa muito simples para o endereço.  No meu caso (e eu acredito que na maioria dos casos), o padrão resto chama para SharePoint (e possivelmente como um padrão da indústria?) Voltar 100 linhas.  Para retornar mais do que o padrão, Use o parâmetro $top no seu telefonema, como em:

OBTER /Insights Dev/_api/web/lists/GetByTitle('MockBlog')/itens?$Selecione = ID,Título,Categorias/título,Blog_x0020_Author/título,DatePublished,BlogSummary&$expandir = Blog_x0020_Author,Categorias&$filtro =&$Top = 9999

Eu escolhi 9999 Neste caso já que sei que growth-wise, Não haverá mais de 200 ou então linhas adicionadas a esta lista em um ano.  Se torna-se desajeitado, Podemos implementar uma paginação na estrada.

</fim>

undefinedSubscreva ao meu blog.

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

Rápido e simples: Resolver "parâmetro de URL inválido” problema com UpdateListItems em lists. asmx

Quando trabalhando com UpdateListItems via Lists. asmx, é fácil gerar o erro:

Parâmetro de URL inválido.

A URL fornecida contém um comando inválido ou o valor. Por favor verifique a URL novamente.

Você pode obter este erro quando você esquecer de incluir o ID na lista de campos para atualizar.  Isso, como um monte de SP, esses serviços da web, é um pouco intuitivo, pois você precisa incluir o ID no atributo ID do <Método> elemento.  E você não está atualizado ID e provavelmente nunca mais quero em primeiro lugar.

Este envelope SOAP funciona:

<soapenv:Envelope xmlns:soapenv =' http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Corpo>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <atualizações>                     
         <Lote OnError ="Continuar">
          <Método ID ="1" Cmd ="Update">
            <Nome do campo ="CooperativeLock">trancado!</Campo>
            <Nome do campo ="ID">1</Campo>
          </Método>
        </Lote>                     
        </atualizações>                
      </UpdateListItems>             
  </soapenv:Corpo>         
</soapenv:Envelope>

Se você retirar a referência de campo ID, então você vai ter a irritante mensagem "Parâmetro de URL inválido".

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

Como: Configurar o teste unitário e cobertura de teste com QUnit.js e Blanket.js para um escritório 365 App do SharePoint

Intro

Eu estive explorando testes de unidade e teste de cobertura para JavaScript como eu trabalho em um novo aplicativo do SharePoint para SharePoint online no escritório 365 Suite.  Os caminhos de pesquisa óbvio levaram-me a Qunit.js e logo depois que, Para Blanket.js.

QUnit deixe-me criar testes de unidade e agrupá-los em módulos.  Um módulo é apenas uma maneira simples de organizar testes relacionados. (Não tenho certeza se que vou usá-lo como pretendido, Mas funcionou para mim até agora com o pequeno conjunto de testes que definiu até agora).

Blanket.js integra com Qunit e ele vai me mostrar as linhas reais de JavaScript que foram – e mais importante – não foram realmente executadas no decurso da execução dos testes.  Esta é a "cobertura" – linhas que executado são cobertas pelo teste, enquanto outros não são.

Entre a criação de casos de teste boas e visualização de cobertura, Podemos reduzir o risco de que nosso código escondido defeitos.  Bons tempos.

Qunit

Supondo que você tenha seu Visual Studio projeto configurado, Comece baixando o pacote de instalação JavaScript http://qunitjs.com.  Adicione o JavaScript e CSS correspondente à sua solução.  Mina parece com isso:

image

Figura 1

Como você pode ver, Eu estava usando 1.13.0 na época, eu escrevi este post de blog. Não se esqueça de baixar e adicionar o arquivo CSS.

Que saia do caminho, próximo passo é criar algum tipo de equipamento de teste e referenciar os bits Qunit.  Estou testando um monte de funções em um arquivo de script chamado "QuizUtil.js", então eu criei uma página HTML chamada "QuizUtil_test.html", como mostrado:

image Figura 2

Aqui está o código:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/TR/1998/REC-xml-19980210 1999/xhtml">
<cabeça>
    <título>Teste de QuizUtil com Qunit</título>
    <link rel= "stylesheet" href="../CSS/qunit-1.13.0.css" />
    <script tipo= text/javascript"" src="QuizUtil.js" dados-capa></script>
    <script type ="text/javascript" src ="qunit-1.13.0.js"></script>
    <script type ="text/javascript" src ="blanket.min.js"></script>

    <script>
        módulo("getIDFromLookup");
        teste("QuizUtil getIDFromLookupField", função () {
            var goodValue = "1;#Paul Galvin";

            igual(getIDFromLookupField(goodValue) + 1, 2), "ID do [" + goodValue + "] + 1 deve ser 2";
            igual(getIDFromLookupField(indefinido), indefinido, "O argumento de entrada indefinido deve retornar o resultado indefinido.");
            igual(getIDFromLookupField(""), indefinido, "O argumento de entrada vazio deve retornar um valor indefinido.");
            igual(getIDFromLookupField("gobbledigood3-thq;ada dkvn;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), indefinido,"Deve sempre retornar um conversível de resultado para um número inteiro");
            igual(getIDFromLookupField("2;#outra pessoa"), "2", "Verificação [2;#outra pessoa].");
            igual(getIDFromLookupField("9834524;#valor longo"), "9834524", "Teste de grande valor.");
            notEqual(getIDFromLookupField("5;#qualquer um", 6), 6, "Testar um notEqual (5 Não é igual a 6 para esta amostra: [5;#qualquer um]");

        });

        módulo("htmlEscape");
        teste("QuizUtil htmlEscape()", função () {
            igual(htmlEscape("<"), "&lt;", "Escapando um menos que o operador ('<')");
            igual(htmlEscape("<classe div =  "someclass">Algum texto</div>"), "&lt;classe div =&quot;SomeClass&quot;&gt;Algum texto&lt;/div&gt;", "Sequência de teste mais complexa.");
        });

        módulo("getDateAsCaml");
        teste("QuizUtil getDateAsCaml()", função () {
            igual(getDateAsCaml(Novo Data("31/12/2013")), "2013-12-31T:00:00:00", "Teste codificada data: [12/31/2013]");
            igual(getDateAsCaml(Novo Data("01/05/2014")), "2014-01-05T:00:00:00", "Teste codificada data: [01/05/2014]");
            igual(getDateAsCaml(Novo Data("01/31/2014")), "2014-01-31T:00:00:00", "Teste codificada data: [01/31/2014]");
            igual(getTodayAsCaml(), getDateAsCaml(Novo Data()), "getTodayAsCaml() deve ser igual getDateAsCaml(nova data())");
            igual(getDateAsCaml("valor absurdo"), indefinido, "Tente obter a data de um valor absurdo.");
            igual(getDateAsCaml(indefinido), indefinido, "Tente obter a data da [indefinido] Data.");
        });

        módulo("getParameterByName");
        teste("QuizUtil getParameterByName (da cadeia de caracteres de consulta)", função () {
            igual(getParameterByName(indefinido), indefinido, "Tentar obter parâmetro indefinido deve retornar indefinido.");
            igual(getParameterByName("não existe"), indefinido, "Tentar obter o valor do parâmetro, quando sabemos que o parâmetro não existe.");

        });

        módulo("Cookies");
        teste("QuizUtil várias funções do cookie.", função () {
            igual(setCookie("teste", "1", -1), getCookieValue("teste"), "Obter um cookie eu definir deve funcionar.");
            igual(setCookie("anycookie", "1", -1), verdadeiro, "Definir uma cozedura válido deve retornar 'verdadeiro'.");
            igual(setCookie("nome do cookie louco !@#$%"%\^&*(()?/><.,", "1", -1), verdadeiro, "Definir um nome de cookie ruim deve retornar 'falso'.");
            igual(setCookie(indefinido, "1", -1), indefinido, "Passando indefinido como o nome do cookie.");
            igual(getCookieValue("não existe"), "", "Cookie não existe teste.");
        });

    </script>
</cabeça>
<corpo>
    <div ID= "qunit"></div>
    <div ID= "qunit-dispositivo elétrico"></div>

</corpo>
</HTML>

Existem várias coisas a acontecer aqui:

  1. Referenciando o meu código (QuizUtil.js)
  2. Referência Qunity.js
  3. Definição de alguns módulos (getIDFromLookup, Cookies, e outros)
  4. Colocando um <div> cuja ID é "qunit".

Em seguida, Só parar nesta página e você obter algo como isto:

image

Figura 3

Se você olhar no topo, Você tem algumas opções, dois dos quais são interessantes:

  • Ocultar passada testes: Bem óbvio.  Pode ajudar o seu olho vê apenas as áreas de problema e não um monte de desordem.
  • Módulo: (Deixe cair para baixo): Isso filtrará os testes até apenas os grupos de testes que você quer.

Quanto os testes se-alguns comentários:

  • Escusado será dizer que você precisa para escrever seu código de tal forma que é testável em primeiro lugar.  Usando a ferramenta pode ajudar a impor essa disciplina. Por exemplo, Eu tinha uma função chamada "getTodayAsCaml()”.  Isso não é muito testável, uma vez que não leva nenhum argumento de entrada e para testá-lo para a igualdade, precisamos atualizar constantemente o código de teste para refletir a data atual.  Eu refatorado isso adicionando um parâmetro de entrada de dados, em seguida, passando a data atual, quando eu quero a data atual no formato do CAML.
  • O quadro de Qunit documentos seus próprios testes e parece bastante robusto.  Ele pode fazer coisas simples, como teste de igualdade e também tem suporte para chamadas de estilo ajax ("real" ou fictícios usando seu favorito mocker).
  • Passando pelo processo também força você a pensar em casos extremos – o que acontece com o "indefinido" ou null é passado para uma função.  Torna absolutamente simples testar esses cenários para fora.  Coisas boas.

Cobertura com Blanket.js

Blanket.js complementa Qunit seguindo as linhas reais de código que executar durante o curso da executando os testes.  Então mesmo que é um aplicativo totalmente separado integra direito em Qunit, Ele joga muito bem – parece que é um app sem emenda.

Isto é blanket.js em ação:

image Figura 4

image

Figura 5

(Você realmente tem que clicar sobre a opção "Ativar a cobertura" no topo [Ver figura 3] para permitir isto.)

As linhas realçadas em figura 5 Não foram executados por qualquer um dos meus testes, Então eu preciso elaborar um teste que faz com que eles executar se quero cobertura completa.

Se blanket.js a trabalhar, seguindo estes passos:

  1. Baixá-lo http://blanketjs.org/.
  2. Adicioná-lo ao seu projeto
  3. Atualize sua página de equipamento de teste (QuizUtil_test.html no meu caso) como segue:
    1. O código de referência
    2. Decore seu <script> referência como este:
    <script tipo= text/javascript"" src="QuizUtil.js" dados-capa></script>

Blanket.js pega o atributo "dados-capa" e faz sua mágica.  Ganchos em Qunit, atualiza a interface do usuário para adicionar a opção "Ativar cobertura" e voila!

Resumo (TL; DR)

Use Qunit para escrever seus casos de teste.

  • Faça o download
  • Adicioná-lo ao seu projeto
  • Escrever uma página de teste arnês
  • Criar seus testes
    • Alguns dos seu código seja testável refatorar
    • Ser criativo!  Acho que de loucura, impossíveis cenários e testá-los de qualquer maneira.

Use blanket.js para garantir a cobertura

  • Certifique-se de que qunit está funcionando
  • Baixar blanket.js e adicioná-lo ao seu projeto
  • Adicioná-lo à sua página de equipamento de teste:
    • Adicionar uma referência a blanket.js
    • Adicionar um atributo "dados-capa" para seus <script> Tag
  • Executar testes Qunit.

Eu nunca fiz isso antes e tinha umas coisas rudimentares, trabalhando em um punhado de horas. 

Teste feliz!

</fim>

undefinedSubscreva ao meu blog.

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

O último terno, que você nunca vai usar?

[Quick note – este é um post muito longo em um trabalho de abertura para o meu grupo aqui em Nova York e é preciso viver na área tri-state, se você está interessado.]

Entrei Slalom consultoria sobre 18 meses atrás e que isso torna meu trabalho mais longa e duradouro desde 2007. Não planejo isso dessa forma. Antes de uma seqüência de caracteres de apropriação do trabalho que começou com meu salto para o mundo do SharePoint, Eu estava em um lugar durante onze anos. Eu finalmente encontrei um novo, resistindo o local de trabalho para o longo curso aqui no Slalom.

Este lugar está crescendo e preciso de ajuda para controlar o que. O tipo de ajuda que eu preciso é normalmente chamado um "arquiteto de soluções do SharePoint" embora eu encontrei a palavra arquiteto ser mais e/ou incorretamente usado no espaço do SharePoint durante muito tempo agora. Eu tenho lutado sobre como blog sobre isso. Não quero simplesmente listar fora um monte de pontos de bala no estilo Dice/monstro. Meus colegas de recrutamento excelentes tem feito que já :). Assim, Eu decidi tomar uma abordagem de "a day in the life". Li e considerar:

1) Se apela e

2) Se você sabe em seus ossos que você pode fazer isso.

Se sim, Contate-me (Paul.Galvin@slalom.com) e vamos falar.

Estes são o que você pode esperar para fazer na semana/mês típico como arquiteto de soluções na minha equipe:

  • Executar projetos, muitas vezes mais do que um de cada vez. Alguns projetos são grandes e assim você possuiria um projeto. "Executando" um projeto significa que você tem a supervisão e responsabilidade pela qualidade geral da entrega. Em quase todos os casos, você vai ter um PM e uma equipe muito forte de devs, CARRO, Pessoas UX, etc., para apoiá-lo. Mas você vai ser a cara principal, que o cliente vê, relações de confiança, etc. Não há nenhum escondido nas sombras neste papel :). Você vai faturar esse tempo e o objetivo é mantê-lo ocupado o suficiente para fazer isso 80 por cento do tempo.
  • Ajudar com a papelada-porcas, RFPs, plataformas – tudo o que de bom material. Eu acho que nós temos o nosso processo de semear para baixo muito apertado e sólidos assim é bastante estereotipada. Se você está acostumado a escrever porcas hoje, nosso processo não vai ser um desafio para você. RFPs – Estas são um pouco mais difícil. Eles tendem a ser acordada na natureza para começar com e RFPs puxar normalmente em vários autores diferentes. É bom e ruim, mas principalmente boa. Isso pode ficar scrambly quando é preciso conciliar a necessidade de atendimento excelente ao também tentar ganhar novos trabalhos. Você provavelmente não vai possuir uma RFP, mas você será solicitado a contribuir seções.
  • Chamadas de vendas, mas não mais de perto. No decurso de um mês, Você pode esperar para ir em um par de chamadas de vendas com nossa equipe de vendas. Você vai ser a PME na sala, tomar notas e ajudar a moldar a solução. No entanto, você não pediu ou esperado para lidar com o ciclo de vendas do início ao fim. Você não precisa "vender,"você só precisa ser a voz calma da razão especialista na sala. Isso cria confiança e é por isso que você está lá. É claro, Se você gosta de vender, Então, há espaço para que você possa crescer aqui também.
  • Ajuda com recrutamento. Nós temos algum tipo de programa de referência, então se você realmente sabe gente forte na Comunidade que você acha que deve ser parte de Slalom, Você pode se beneficiar dessa forma. Nós dedicamos recrutadores (que são excelentes) para fazer parte a maior deste tipo de trabalho. A ajuda real é entrevistar candidatos – eles são uma boa opção cultural? Eles conhecem as suas coisas? Eles podem fazer * minha * vida mais fácil? 🙂 This comes in spurts, algumas vezes por mês, Embora em alguns meses você não faria isso em todos os.
  • Ajudar a definir as melhores práticas, construir nosso IP e tornar-nos mais competitivos no mercado. Você é uma cara experiente/gal. Você está em volta do quarteirão – não apenas em SharePoint, mas você tem experiência em outras tecnologias e viveu bons e maus (mesmo terrível) projetos mais. Como resultado, você sabe o que funciona e o que não. Haveremos de querer compartilhar essa experiência conosco em uma base do dia-a-dia no sentido tático (ou seja. executar os seus projetos realmente bem) mas também estrategicamente. "Melhores práticas" é um pouco em demasia como um termo e hesito em usá-lo. A idéia básica é que você está vindo como uma pessoa experiente com experiência profunda e relevante e queremos integrar o melhor de seu aprendizado, como nos envolvemos com os clientes em uma base do dia-a-dia.
  • Divertir-se -Nós somos um grupo muito integrado. Eu quero evitar mais uma platitude, mas neste caso é realmente apt-nós trabalhamos duro (tipo de) e vamos jogar ainda mais difícil :). Há um tipo de Aaron Sorkin de brincadeiras aqui, a sala está sempre cheia de gente inteligente, Nós gostamos de nossa bebida e organizamos um número razoável de diversão eventos – noite de cinema, viagens de beisebol (mesmo se eles são horrível, equipes praticamente maus).

Se eu pudesse resumir tudo em uma palavra, Gostaria de usar a palavra "liderança". Conduzir projetos, assumir um papel de liderança na construção da prática (IP, construção de equipe), etc.

Mas esperar! Há mais! Por que mais trabalha no Slalom?

  • Notável unidade de intenções – todos querem crescer essa coisa fora. "Essa coisa" é o escritório de Nova York. Todos estão a bordo com isto.
  • Vento em suas velas – irmã escritórios, irmã pratica-Slalom é um "serviço completo", organização de consultoria. Eu levo a prática de SharePoint (uma "prática área conduzir" no jargão do Slalom). Eu tenho irmã práticas no 11 outros escritórios de Slalom. Assim mesmo que eu sou rei na medida em que SharePoint está em causa aqui em Nova Iorque de Slalom, Tenho práticas de pares em Chicago, Seattle, Dallas, Atlanta, Boston, etc. de onde eu posso desenhar com suporte. É realmente o melhor dos dois mundos – autonomia significativa aqui em Nova York, mas acesso a toneladas de talento em toda a organização.
  • Vento em suas vendas (2) -Fazemos mais do que o SharePoint – muito mais. Fazemos BI, CRM, UX, consultoria de negócios, Celular, desenvolvimento personalizado e outros. Nós somos bons em cross-selling entre nós e nós somos bons em pintura – e mais importante, entrega de cima – uma "serviço completo" imagens para os nossos clientes. Isto é especialmente atraente para mim. Eu estive em muitas orgs menores trabalhando em shows de SharePoint e frustrado e outra vez porque estávamos pombo furado como o "povo do SharePoint". Que não acontece com o Slalom e nós começamos a fazer o trabalho mais interessante assim.
  • Modelo local – nenhum curso.
  • Crescimento de longo prazo – a Slalom vai gangbusters. Lotes de estabilidade e crescimento. Crescimento também significa que temos de contratar líderes hoje à frente novas equipes como podemos adicionar mais clientes e funcionários para dar suporte a esses clientes.

Eu poderia ir, Mas eu tenho provavelmente já foi longe demais. Acho que capturei a essência aqui. Se você estiver pensando em mudar de empregos e isso parece ser bom para você, Vamos falar.

Se você é feliz no seu emprego atual – vamos falar de qualquer maneira :). Eu estive em muitos lugares e estava muito "feliz" no momento. Slalom é diferente e eu gostaria de receber uma oportunidade para convencer você de que.

</fim>

undefinedSubscreva ao meu blog.

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

Rápido e fácil: Definir o tamanho dos itens em uma caixa de listagem em uma loja de Windows App

Estou criando em um Windows App Store, Quero mostrar ao usuário várias mensagens informativas.  Eu escolhi um ListBox como a ferramenta para mostrá-lo para que eles podem rolar nas coisas deles e muito bom. 

As mensagens são informativas somente, Então não há nenhuma necessidade de fornecer tudo o que mais espaço em branco ao redor deles, desde que o usuário nunca pode selecioná-los para alguma coisa.  O comportamento padrão do ListBox fornece uma quantidade substancial de enchimento e queria se livrar dele.  Bem.... Não pode fazer esse tipo de coisa na ListBox diretamente.  NO ENTANTO, Você pode fazê-lo para os itens que você adicionar:

        privada privatevoid AddGameStateLogMessage(Cadeia de caracteres Amensagem)
        {
            TextBox t = Novo TextBox();
            t.Text = GameStateCounter     + ": " + Amensagem;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Espessura thisPadding = Novo Espessura(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = Novo ListBoxItem();
            Li.Conteúdo = t;
            Li.MaxHeight = 25;
            thisPadding = Novo Espessura(5, 0, 5, 0);
            Li.Preenchimento = thisPadding;

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

no exemplo acima, Eu estou criando um TextBox e definindo sua fonte, seu preenchimento, etc.

Próximo, Eu criar um ListBoxItem e definir seu conteúdo para a caixa de texto formatada.

Finalmente, Para inserir o ListBoxItem para o ListBox.  (Quero mostrar as mensagens mais recentes no topo da lista, Portanto, a inserção(0,Li) em vez de um simples adicionar() invocação.).

Vai ser-isso aprimorando um pouco antes, estou muito feliz com o comportamento de ListBox, mas o padrão mostrado acima tem sido muito proveitoso.  Espero que outra pessoa acha útil.

</fim>

undefinedSubscreva ao meu blog.

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