Возвращение JSON в CFFunction и добавление его в слой вызывает ошибку - PullRequest
0 голосов
/ 07 июня 2010

Я использую плагин qTip jQuery для генерации динамической всплывающей подсказки.Я получаю сообщение об ошибке в моем JS, и я не уверен, является ли его источником JSON или JS.Всплывающая подсказка вызывает следующую функцию: (извините за весь этот код, но это необходимо)

<cffunction 
name="fGameDetails"
access="remote"
returnType="any"
returnformat="JSON"
output="false"
hint="This grabs game details for the games.cfm page">
    <!---Argument, which is the game ID--->
<cfargument 
    name="gameID"
    type="numeric"
    required="true"
    hint="CFC will look for GameID and retrieve its details">
<!---Local var--->
<cfset var qGameDetails = "">
<!---Database query--->
<cfquery name="qGameDetails" datasource="#REQUEST.datasource#">
SELECT
    titles.titleName AS tName,
    titles.titleBrief AS tBrief,
    games.gameID,
    games.titleID,
    games.releaseDate AS rDate,
    genres.genreName AS gName,
    platforms.platformAbbr AS pAbbr,
    platforms.platformName AS pName,
    creviews.cReviewScore AS rScore,
    ratings.ratingName AS rName
FROM
    games
        Inner Join platforms ON platforms.platformID = games.platformID
        Inner Join titles ON titles.titleID = games.titleID
        Inner Join genres ON genres.genreID = games.genreID
        Inner Join creviews ON games.gameID = creviews.gameID
        Inner Join ratings ON ratings.ratingID = games.ratingID
WHERE 
    (games.gameID = #ARGUMENTS.gameID#);
</cfquery>
<cfreturn qGameDetails>
</cffunction>

Эта функция возвращает следующий JSON:

{
    "COLUMNS": [
        "TNAME",
        "TBRIEF",
        "GAMEID",
        "TITLEID",
        "RDATE",
        "GNAME",
        "PABBR",
        "PNAME",
        "RSCORE",
        "RNAME"
    ],
    "DATA": [
        [
            "Dark Void",
            "Ancient gods known as 'The Watchers,' once banished from our world by superhuman Adepts, have returned with a vengeance.",
            154,
            54,
            "January, 19 2010 00:00:00",
            "Action & Adventure",
            "PS3",
            "Playstation 3",
            3.3,
            "14 Anos"
        ]
    ]
}

Проблема, с которой я столкнулся,каждый раз, когда я пытаюсь добавить JSON к слою #catalog, я получаю синтаксическую ошибку, которая говорит: «отсутствует скобка».Я использую JavaScript:

$(document).ready(function() 
{
    $('#catalog a[href]').each(function()
    {
        $(this).qtip( {
            content: {
            url: '/gamezilla/resources/components/viewgames.cfc?method=fGameDetails',
            data: { gameID: $(this).attr('href').match(/gameID=([0-9]+)$/)[1] },
            method: 'get'
        },
        api: {
            beforeContentUpdate: function(content) {
            var json = eval('(' + content + ')');
            content = $('<div />').append(
                $('<h1 />', {
                    html: json.TNAME
                }));
            return content;
            }
        },
        style: {
            width: 300,
            height: 300,
            padding: 0,
            name: 'light',
            tip: {
                corner: 'leftMiddle',
                size: {
                    x: 40,
                    y : 40
                }
            }
        },
        position: {
            corner: {
                target: 'rightMiddle',
                tooltip: 'leftMiddle'
            }
        }
        });
    });
});

Есть идеи, где я ошибаюсь?Я пробовал много вещей в течение нескольких дней, и я не могу найти проблему.

Большое спасибо!

Ответы [ 5 ]

1 голос
/ 06 июля 2010

изменить var json = eval('(' + content + ')'); на var json = eval(content); и html: json.TNAME до html: json.COLUMNS.TNAME

1 голос
/ 04 июля 2010

Сделайте console.log(arguments) для первой строки функции beforeContentUpdate (до eval), чтобы убедиться, что аргумент содержимого соответствует ожидаемому?

1 голос
/ 05 июля 2010

Кажется, что beforeContentUpdate не работает. Поэтому я бы предложил использовать onRender callback:

$(document).ready(function () {
    $('#catalog a[href]').each(function () {
        var link = $(this);
        $(this).qtip({
            content: 'loading...',
            api: {
                onRender: function () {
                    var self = this;
                    $.ajax({
                        url: '/gamezilla/resources/components/viewgames.cfc?method=fGameDetails',
                        dataType: 'json',
                        data: { gameID: link.attr('href').match(/gameID=([0-9]+)$/)[1] },
                        success: function (data) {
                            self.updateContent(data.DATA[0][0]);
                        }
                    });
                }
            },
            style: {
                width: 300,
                height: 300,
                padding: 0,
                name: 'light',
                tip: {
                    corner: 'leftMiddle',
                    size: {
                        x: 40,
                        y: 40
                    }
                }
            },
            position: {
                corner: {
                    target: 'rightMiddle',
                    tooltip: 'leftMiddle'
                }
            }
        });
    });
});
1 голос
/ 07 июня 2010

есть дополнительная скобка внизу вашего javascript, после того, как скобка "position" закрыта.

0 голосов
/ 11 ноября 2010

Как оказалось, это отладчик ColdFusion, заставляющий ajax работать очень странно. Я узнал это давным-давно, но только пересмотрел проблему сейчас. Первое, что нужно сделать при обнаружении ошибки такого рода, - отключить отладчик CF, чтобы проверить, не вызывает ли он проблему.

...