2013-12-04 3 views
2

У меня есть модуль requirejs, в котором я пытаюсь загрузить markdownjs. Вот файл:Поведение Strange Requirejs при загрузке Markdown

define(function(require) { 
    'use strict'; 

    var Backbone = require('backbone'); 
    var blogCollectionTemplate = require('hbs!app.templates/blog.collection.view'); 
    var BlogModelView = require('views/blog.item.view'); 
    var markdown = require('markdown'); 

    var BlogCollectionView = Backbone.View.extend({ 
    template: blogCollectionTemplate, 

    initialize: function() { 
     debugger; 
    }, 

    render: function() { 
     this.$el.html(this.template()); 
     this.renderAll(); 
     return this; 
    }, 

    renderAll: function() { 
     var that = this; 
     this.collection.each(function(blog) { 
     that.renderItem(new BlogModelView({model: blog})); 
     }); 
    }, 

    renderItem: function(blog) { 
     this.$el.find('#blog-posts').append(blog.render(blog).el); 
    } 
    }); 

    return BlogCollectionView; 
}); 

Вот мой require.config:

define(function() { 

    require.config({ 
    hbs : { 
     templateExtension : 'hbs', 
     disableHelpers: true, 
     disableI18n : true 
    }, 

    shim: { 
     'backbone': { 
     deps: [ 
      'underscore', 
      'jquery' 
     ], 
     exports: 'Backbone' 
     }, 
     bootstrap: { 
     deps: [ 'jquery' ] 
     }, 
     DlHighlight: { 
     exports: 'DlHighlight' 
     }, 
     'jqueryMockAjax': { 
     exports: '$.mockjax', 
     deps: ['jquery'] 
     }, 
     json2 : { 
     exports: "JSON" 
     }, 
     'underscore': { 
     exports: '_' 
     } 
    }, 

    paths: { 

     backbone: 'libs/backbone/backbone', 
     bootstrap: 'libs/bootstrap/dist/js/bootstrap', 
     DlHighlight: 'libs/hl/hl-all', 
     highlight: 'libs/highlightjs/highlight.pack', 
     jquery: 'libs/jquery/jquery', 
     jqueryMockAjax: 'libs/jquery-mockjax/jquery.mockjax', 
     markdown: 'libs/markdown/lib/markdown', 
     text: 'libs/text/text', 
     underscore: 'libs/underscore/underscore', 

     hbs: 'libs/hbs/hbs', 
     handlebars: 'libs/hbs/Handlebars', 
     i18nprecompile: 'libs/hbs/hbs/i18nprecompile', 
     json2 : 'libs/hbs/hbs/json2', 

     'app.templates': '../templates/' 
    } 
    }); 
}); 

Вот странное поведение. В моем initialize, когда я ударил отладчика, у меня есть доступ к объекту markdown, который я импортировал, но если я попытаюсь использовать объект markdown, тогда он всегда undefined. Если я поставлю markdown в initialize или в одном из методов render, то переменной markdown является undefined. Это не имеет никакого смысла, но есть ли какое-то поведение, которое я не понимаю о requirejs. Есть идеи?

+0

Какой модуль уценки вы пытаетесь загрузить? Если это сторонний модуль, ссылка будет подходящей. – Louis

+0

Я пытаюсь загрузить модуль [this] (https://github.com/evilstreak/markdown-js) 'markdown', но любой будет работать для меня. – jhamm

+0

Спасибо. Этот модуль поддерживает AMD, поэтому он должен работать. Я думаю, что в конфигурации, которую вы передаете в RequireJS, есть что-то неправильное. Можете ли вы добавить его к своему вопросу? – Louis

ответ

2

После прочтения кода установки bower markdown-js, я обнаружил, что установка bower не будет работать с RequireJS as-is. Попробуйте добавить эту подкладку:

"markdown": { 
    exports: "markdown" 
} 

, почему вы были в состоянии получить значение markdown в отладчике без прокладки, я полагаю, вы получаете его (возможно, не осознавая этого) из глобальной области видимости. Markdown-js устанавливает себя в глобальную область (window.markdown, которая затем доступна как markdown, если никакая другая переменная не мешает ей) при ее загрузке. Это предположение, но оно соответствует фактам.

+0

Это сработало. Зачем это вообще работать без прокладки? Когда я ударил свой оператор 'debugger', я смог получить доступ к' markdown' без прокладки. – jhamm

+0

Обновленный ответ. – Louis

+0

А это имеет смысл. Думаю, я бы никогда не догадался об этом, потому что я предположил, что его использование «магистрали» также экспортируется в «Backbone» в глобальном масштабе. :-П – Vinay

1

Вы можете требовать от всех этих модулей в самом пункте define:

define([ 
    'backbone', 
    'hbs!app.templates/blog.collection.view', 
    'views/blog.item.view', 
    'markdown' 
], function (
    Backbone, 
    blogCollectionTemplate, 
    BlogModelView, 
    markdown 
) { 
    'use strict'; 

    // do stuff 
}); 

Кроме того, что вы имеете в виду под «Если я ставлю уценки в инициализации или в одном из методов отображения»? Вы имеете в виду, что явным образом требую уценки при инициализации и рендеринге? Есть ли причина не просто указывать нагрузку в предложении define, как указано выше?

Если вы явно требуете уценки при инициализации или рендеринге, я не уверен, почему это вернет undefined, но сообщите мне, если требования по перемещению в предложение define устраняют вашу проблему (или если вы не можете этого сделать). Возможно, вы можете опубликовать код в модуле markdown (если это не библиотека)?

+0

. Что я подразумевал, поставив 'markdown' в методы' initialize' или 'render', я бы импортировал' markdown' вверху, как нормально, но когда я попытался использовать ссылку 'markdown', тогда она была бы неопределенной в том же самом отладчике, где до его определения. Я изменил свой оператор 'define', чтобы загрузить модули, как вы показываете выше, и то же самое произошло, моя' markdown' была 'undefined' в моей функции' initialize'. – jhamm

+0

А я вижу. Я отвечу на этот вопрос в случае необходимости-noobie. – Vinay

Смежные вопросы