Pergunta

Estou chamando um componente ColdFusion (CFC) usando jQuery.post (). Preciso de uma representação inteira ou string do número retornado para uso em um URL.

{"PAGE":"My Page Title","ID":19382}
or
{"PAGE":"My Page Title","ID":"19382"}

Em vez disso, o que recebo é um decimal:

{"PAGE":"My Page Title","ID":19382.0}

Precisava atualizar o seguinte HTML:

<a href="page.cfm?id=19382" id="pagelink">My Page Title</a>

Conceitualmente, suponho que há várias respostas:

1) Eu poderia usar o jQuery para pegar o número restante do ponto decimal.

2) Eu poderia forçar o ColdFusion a enviar o número como uma string.

3) Eu poderia gerar todo o lado do servidor de link e apenas substituir a tag de link HTML (não a resposta preferida, mas talvez seja a melhor)

Alguém sabe como fazer 1 ou 2? 3 é melhor?

JavaScript relevante: (não otimizado)

$(".link").live('click', function () {
    var $linkID, serviceUrl;
    serviceUrl = "mycfc.cfc?method=getPage";
    $linkID = $(this).attr("rel");

    $.post(serviceUrl, { linkid: $linkID }, function (result) { 
        $('#pagelink').val(result.TITLE);
        if (result.FMKEY.length) {
             // NEED the ID number WITHOUT the .0 at the end
             $('#pagelink').attr("href") = "page.cfm?id=" + result.ID;
             $('#pagelink').text(result.TITLE);
        }
    }, "json");
});

Meu CFC:

<component output="no">
<cfsetting showdebugoutput="no">
<cffunction name="getPage" access="remote" returnFormat="JSON" output="no" hint="Looks up a Page Title and ID">
    <cfargument name="linkID" type="string" required="yes">
    <cfset var page = queryNew("id,title")>
    <cfset var result = structNew()>
    <cfquery datasource="myDatasource" name="page">
        SELECT TOP 1 id, title
        FROM pages
        WHERE linkID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.linkID#">     
    </cfquery>
    <cfif page.recordcount>
        <cfset result.id = page.id>
        <cfset result.title = page.title>
    </cfif>
    <cfreturn result>
</cffunction>
</component>
Foi útil?

Solução

usar parseInt() em JS. Kindda gosta da sua solução 1, mas isso é mais fácil do que você pensa.

$('#pagelink').attr("href") = "page.cfm?id=" + parseInt(result.ID, 10);

CF serializa qualquer número inteiro como 123 em "123.0" por padrão, mas geralmente não importa em linguagem tipulosa como JS ou CF para o assunto.

O comportamento padrão de SerializeJSON() (O que a função remota usa) não pode ser substituída, mas se você quiser, você pode usar uma das bibliotecas JSON de terceiros em www.riaforge.org

ps mesmo se você navegar para "algo.cfm? id = 123.0", URL.id é apenas um valor numérico no CF que o Eq a 123. Embora seu URL pareça um pouco estranho, se estiver postando para CF, ainda funcionará.

Outras dicas

É um bug/recurso conhecido de serializejson (). Ver esta resposta Para uma possível solução alternativa.

Como um aparte, para quando você preferir usar a solução 2) "Eu poderia forçar o ColdFusion a enviar o número como uma string", por exemplo, ao usar um plug -in que espera strings como Datatable e não querendo tocar no código do cliente ...

Apenas tentar forçar o número ou string que representa um número como abaixo não funcionará:

Test["caseSensitiveName"] = "#numericString#";

Mas adicionando um espaço líder vai forçar o tipo de string json:

Test["caseSensitiveName"] = " #numericString#";

Hack Hack, mas pode ser útil.

2) Eu poderia forçar o ColdFusion a enviar o número como uma string.

Você está fazendo alguma matemática com o ID? Provavelmente não. No que diz respeito ao seu jQuery, essa é uma string que contém apenas números, não um número inteiro. Trate -o como tal.

Chegando a partir de outro ângulo, se você também controlar o back -end, poderá tentar forçar o Coldfusion a serializar o número como um número inteiro, usando o Javacast ("int", alguma vez, que não é defusionThinkSisafloat).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top