Durandal Weyland/ Оптимизатор Requirejs с кендо и датавиз
Я создаю приложение с Durandal, чтобы связать его с PhoneGap. Когда я пытаюсь запустить оптимизатор Weyland, у меня возникают некоторые проблемы. Сборка и оптимизация выполняются без каких-либо ошибок (я использую requirejs в качестве оптимизатора), но когда я запускаю приложение, моя диаграмма пользовательского интерфейса kendo выдает ошибку, говорящую "Uncaught TypeError: Object [object Object] не имеет метода kendoChart".
Если я сделаю паузу в режиме отладки в chrome, где происходит привязка kendoChart, и наберу в консоли "kendo", я получу kendoobject и смогу просмотреть его свойства и т. Д., Так что он определенно находится в DOM.
Я довольно много гуглю и нашел здесь несколько тем на SO, но ни одна из них, похоже, не решает мою проблему. Например, эта тема или эта.
У меня есть пользовательская привязка нокаута для диаграммы, которая представлена ниже.
Мой weyland.config выглядит так:
exports.config = function (weyland) {
weyland.build('main')
.task.jshint({
include: 'App/**/*.js'
})
.task.uglifyjs({
// not uglyfying anything now...
//include: ['App/**/*.js', 'Scripts/durandal/**/*.js', 'Scripts/custom/**/*.js']
})
.task.rjs({
include: ['App/**/*.{js,html}', 'Scripts/custom/**/*.js', 'Scripts/jquery/*.js', 'Scripts/durandal/**/*.js'],
exclude: ['Scripts/jquery/jquery-2.0.3.intellisense.js', 'App/main.js'],
loaderPluginExtensionMaps: {
'.html': 'text'
},
rjs: {
name: 'main',
baseUrl: 'App',
paths: {
'text': '../Scripts/text',
'durandal': '../Scripts/durandal',
'plugins': '../Scripts/durandal/plugins',
'transitions': '../Scripts/durandal/transitions',
'knockout': '../Scripts/knockout/knockout-2.3.0',
'kendo': 'empty:', <-- tried refering kendo.all.min, or dataviz.chart or the path
'jquery': '../Scripts/jquery/jquery-2.0.3.min',
'Helpers': '../Scripts/custom/helpers',
........ other scripts ......
},
deps: ['knockout', 'ko_mapping', 'command'],
callback: function (ko, mapping, command) {
ko.mapping = mapping;
}
//findNestedDependencies: true, **<-- tried both true and false here**
inlineText: true,
optimize: 'none',
pragmas: {
build: true
},
stubModules: ['text'],
keepBuildDir: false,
out: 'App/main-built.js'
}
});
};
// The custom binding for the kendo chart
define([
'knockout',
'jquery',
'Helpers',
'kendo/kendo.dataviz.chart.min'
], function (
ko,
$,
helpers,
kendoui
) {
function drawChart(element, values, options) {
$(element).kendoChart({ **<-- this is where I get an error**
... options for chart ...
});
}
// kendoUi data viz chart
ko.bindingHandlers.moodChart = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
//set the default rendering mode to svg
kendo.dataviz.ui.Chart.fn.options.renderAs = "svg"; **<-- this renders no errors**
// if this is a mobile device
if (kendo.support.mobileOS) {
// canvas for chart for you!
kendo.dataviz.ui.Chart.fn.options.renderAs = "canvas";
}
var values = ko.unwrap(valueAccessor());
setTimeout(function () {
drawChart(element, values);
}, 125);
}
};
});
Я мог бы добавить, что все работает нормально, запуская неоптимизированный код в веб-браузере (или телефоне в этом отношении).
Я также попытался изменить путь кендо в файле конфигурации и добавить зависимость в jquery, которая, похоже, не имеет никакого значения.
Любая помощь будет оценена!
1 ответ
Для больших фреймворков, таких как kendo, которые имеют собственный набор зависимостей, например, для версии jquery, я не склонен связывать их с моими собственными модулями AMD. Личные предпочтения, я знаю. Посмотрите, как вы можете загрузить jquery, knockout и kendo через обычные теги сценария в примере.NET
<body>
<div id="applicationHost"></div>
<script type="text/javascript" src="~/Scripts/jquery-1.9.1.js"></script>
<script type="text/javascript" src="~/Scripts/whateverKendoVersionGoesHere.js"></script>
<script type="text/javascript" src="~/Scripts/knockout-2.3.0.js"></script>
<script type="text/javascript" src="~/Scripts/bootstrap.js"></script>
<script type="text/javascript" src="~/Scripts/require.js" data-main="/App/main"></script>
</body>
Таким образом, jquery и нокаут будут загружены как глобальные. В main.js
вам придется define
jquery
а также knockout
чтобы сделать их доступными для Durandal (см. main.js), Durandal все еще использует их в качестве модулей AMD.
requirejs.config({
paths: {
'text': '../Scripts/text',
'durandal': '../Scripts/durandal',
'plugins': '../Scripts/durandal/plugins',
'transitions': '../Scripts/durandal/transitions'
}
});
define('jquery', function () { return jQuery; });
define('knockout', ko);
define(['durandal/system', 'durandal/app', 'durandal/viewLocator'], function (system, app, viewLocator) {
...
});