Highcharts 7.0.3 с Xpages / dojo

#javascript #highcharts #dojo #xpages

#javascript #highcharts #dojo #xpages

Вопрос:

Я пытаюсь использовать Highcharts в XPage. К сожалению, в консоли написано «Highcharts не определен», и на самом деле у меня нет доступа к объекту Highcharts через консоль браузера, даже если он загружен, как я вижу на вкладке Сеть.

Я подозреваю, что dojo что-то нарушает. Вы можете воспроизвести его с помощью этого HTML-кода:

 <!DOCTYPE html>
<html lang="de">

<head>
    <meta charset="utf-8">
    <title>Titel der Einzelseite</title>
    <meta name="description" content="">
    <meta name="author" content="">
    <meta name="keywords" content="">

    <link href="design.css" rel="stylesheet">
</head>

<body>
<div class="scrolling-container">
    <div id="container"></div>
</div>
<script src="https://download.dojotoolkit.org/release-1.9.7/dojo.js.uncompressed.js"></script>
<script src="https://code.highcharts.com/gantt/highcharts-gantt.js"></script>
<script src="https://code.highcharts.com/gantt/modules/exporting.js"></script>
<script>
// Set to 00:00:00:000 today
var today = new Date(),
    day = 1000 * 60 * 60 * 24,
    map = Highcharts.map,
    dateFormat = Highcharts.dateFormat,
    series,
    cars;

// Set to 00:00:00:000 today
today.setUTCHours(0);
today.setUTCMinutes(0);
today.setUTCSeconds(0);
today.setUTCMilliseconds(0);
today = today.getTime();

cars = [{
    model: 'Nissan Leaf',
    current: 0,
    deals: [{
        rentedTo: 'Lisa Star',
        from: today - 1 * day,
        to: today   2 * day
    }, {
        rentedTo: 'Shane Long',
        from: today - 3 * day,
        to: today - 2 * day
    }, {
        rentedTo: 'Jack Coleman',
        from: today   5 * day,
        to: today   6 * day
    }]
}, {
    model: 'Jaguar E-type',
    current: 0,
    deals: [{
        rentedTo: 'Martin Hammond',
        from: today - 2 * day,
        to: today   1 * day
    }, {
        rentedTo: 'Linda Jackson',
        from: today - 2 * day,
        to: today   1 * day
    }, {
        rentedTo: 'Robert Sailor',
        from: today   2 * day,
        to: today   6 * day
    }]
}, {
    model: 'Volvo V60',
    current: 0,
    deals: [{
        rentedTo: 'Mona Ricci',
        from: today   0 * day,
        to: today   3 * day
    }, {
        rentedTo: 'Jane Dockerman',
        from: today   3 * day,
        to: today   4 * day
    }, {
        rentedTo: 'Bob Shurro',
        from: today   6 * day,
        to: today   8 * day
    }]
}, {
    model: 'Volkswagen Golf',
    current: 0,
    deals: [{
        rentedTo: 'Hailie Marshall',
        from: today - 1 * day,
        to: today   1 * day
    }, {
        rentedTo: 'Morgan Nicholson',
        from: today - 3 * day,
        to: today - 2 * day
    }, {
        rentedTo: 'William Harriet',
        from: today   2 * day,
        to: today   3 * day
    }]
}, {
    model: 'Peugeot 208',
    current: 0,
    deals: [{
        rentedTo: 'Harry Peterson',
        from: today - 1 * day,
        to: today   2 * day
    }, {
        rentedTo: 'Emma Wilson',
        from: today   3 * day,
        to: today   4 * day
    }, {
        rentedTo: 'Ron Donald',
        from: today   5 * day,
        to: today   6 * day
    }]
}];

// Parse car data into series.
series = cars.map(function (car, i) {
    var data = car.deals.map(function (deal) {
        return {
            id: 'deal-'   i,
            rentedTo: deal.rentedTo,
            start: deal.from,
            end: deal.to,
            y: i
        };
    });
    return {
        name: car.model,
        data: data,
        current: car.deals[car.current]
    };
});

Highcharts.ganttChart('container', {
    series: series,
    title: {
        text: 'Car Rental Schedule'
    },
    tooltip: {
        pointFormat: '<span>Rented To: {point.rentedTo}</span><br/><span>From: {point.start:%e. %b}</span><br/><span>To: {point.end:%e. %b}</span>'
    },
    xAxis: {
        currentDateIndicator: true
    },
    yAxis: {
        type: 'category',
        grid: {
            columns: [{
                title: {
                    text: 'Model'
                },
                categories: map(series, function (s) {
                    return s.name;
                })
            }, {
                title: {
                    text: 'Rented To'
                },
                categories: map(series, function (s) {
                    return s.current.rentedTo;
                })
            }, {
                title: {
                    text: 'From'
                },
                categories: map(series, function (s) {
                    return dateFormat('%e. %b', s.current.from);
                })
            }, {
                title: {
                    text: 'To'
                },
                categories: map(series, function (s) {
                    return dateFormat('%e. %b', s.current.to);
                })
            }]
        }
    }
});

</script>
</body>
</html>
  

Если вы опустите импорт dojo, это сработает. У кого-нибудь есть идея, почему?

Комментарии:

1. Это проблема с загрузчиком AMD. Найдите здесь, в Stack Overflow, как это исправить в XPages

Ответ №1:

Попробуйте это XPage , это должно сработать:

 <?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" createForm="false">

    <xp:this.properties>
        <xp:parameter name="xsp.resources.aggregate" value="true" />
     </xp:this.properties>

    <xp:this.resources>
        <xp:headTag tagName="script">
            <xp:this.attributes>
                <xp:parameter name="type" value="text/javascript" />
                <xp:parameter name="src"
                    value="https://code.highcharts.com/gantt/highcharts-gantt.js" />
            </xp:this.attributes>
        </xp:headTag>
        <xp:headTag tagName="script">
            <xp:this.attributes>
                <xp:parameter name="type" value="text/javascript" />
                <xp:parameter name="src"
                    value="https://code.highcharts.com/gantt/modules/exporting.js" />
            </xp:this.attributes>
        </xp:headTag>
    </xp:this.resources>

<div class="scrolling-container">
    <div id="container"></div>
</div>

<script>
// Set to 00:00:00:000 today
var today = new Date(),
    day = 1000 * 60 * 60 * 24,
    map = Highcharts.map,
    dateFormat = Highcharts.dateFormat,
    series,
    cars;

// Set to 00:00:00:000 today
today.setUTCHours(0);
today.setUTCMinutes(0);
today.setUTCSeconds(0);
today.setUTCMilliseconds(0);
today = today.getTime();

cars = [{
    model: 'Nissan Leaf',
    current: 0,
    deals: [{
        rentedTo: 'Lisa Star',
        from: today - 1 * day,
        to: today   2 * day
    }, {
        rentedTo: 'Shane Long',
        from: today - 3 * day,
        to: today - 2 * day
    }, {
        rentedTo: 'Jack Coleman',
        from: today   5 * day,
        to: today   6 * day
    }]
}, {
    model: 'Jaguar E-type',
    current: 0,
    deals: [{
        rentedTo: 'Martin Hammond',
        from: today - 2 * day,
        to: today   1 * day
    }, {
        rentedTo: 'Linda Jackson',
        from: today - 2 * day,
        to: today   1 * day
    }, {
        rentedTo: 'Robert Sailor',
        from: today   2 * day,
        to: today   6 * day
    }]
}, {
    model: 'Volvo V60',
    current: 0,
    deals: [{
        rentedTo: 'Mona Ricci',
        from: today   0 * day,
        to: today   3 * day
    }, {
        rentedTo: 'Jane Dockerman',
        from: today   3 * day,
        to: today   4 * day
    }, {
        rentedTo: 'Bob Shurro',
        from: today   6 * day,
        to: today   8 * day
    }]
}, {
    model: 'Volkswagen Golf',
    current: 0,
    deals: [{
        rentedTo: 'Hailie Marshall',
        from: today - 1 * day,
        to: today   1 * day
    }, {
        rentedTo: 'Morgan Nicholson',
        from: today - 3 * day,
        to: today - 2 * day
    }, {
        rentedTo: 'William Harriet',
        from: today   2 * day,
        to: today   3 * day
    }]
}, {
    model: 'Peugeot 208',
    current: 0,
    deals: [{
        rentedTo: 'Harry Peterson',
        from: today - 1 * day,
        to: today   2 * day
    }, {
        rentedTo: 'Emma Wilson',
        from: today   3 * day,
        to: today   4 * day
    }, {
        rentedTo: 'Ron Donald',
        from: today   5 * day,
        to: today   6 * day
    }]
}];

// Parse car data into series.
series = cars.map(function (car, i) {
    var data = car.deals.map(function (deal) {
        return {
            id: 'deal-'   i,
            rentedTo: deal.rentedTo,
            start: deal.from,
            end: deal.to,
            y: i
        };
    });
    return {
        name: car.model,
        data: data,
        current: car.deals[car.current]
    };
});

Highcharts.ganttChart('container', {
    series: series,
    title: {
        text: 'Car Rental Schedule'
    },
    tooltip: {
        pointFormat: '<span>Rented To: {point.rentedTo}</span><br/><span>From: {point.start:%e. %b}</span><br/><span>To: {point.end:%e. %b}</span>'
    },
    xAxis: {
        currentDateIndicator: true
    },
    yAxis: {
        type: 'category',
        grid: {
            columns: [{
                title: {
                    text: 'Model'
                },
                categories: map(series, function (s) {
                    return s.name;
                })
            }, {
                title: {
                    text: 'Rented To'
                },
                categories: map(series, function (s) {
                    return s.current.rentedTo;
                })
            }, {
                title: {
                    text: 'From'
                },
                categories: map(series, function (s) {
                    return dateFormat('%e. %b', s.current.from);
                })
            }, {
                title: {
                    text: 'To'
                },
                categories: map(series, function (s) {
                    return dateFormat('%e. %b', s.current.to);
                })
            }]
        }
    }
});

</script>

</xp:view>