#javascript #backbone.js #amd #thorax.js
#javascript #backbone.js #amd #thorax.js
Вопрос:
У меня есть приложение Backbone / AMD, и я хотел бы сделать так, чтобы модель / объект извлекалась в основном модуле при загрузке приложения, а затем была либо доступна, либо могла загружаться в последующие модули без накладных расходов на ее повторную выборку (это модель разрешений и, следовательно, требуется практически везде).
Есть ли чистый способ сделать это?
Ответ №1:
Просто создайте для него собственную зависимость:
define(["backbone", "text!api/v1/user/permissions"],
function(Backbone, permissionJSON) {
return new Backbone.Model(JSON.parse(permissionJSON));
});
Комментарии:
1. Спасибо, это здорово! и 1 за
text!
трюк, я даже не осознавал, что он выполняет надлежащий http-запрос и может использоваться подобным образом. Потрясающе!
Ответ №2:
Если вам требуется модуль, для которого вы хотите сохранить состояние, вы можете сделать следующее
stateMod.js
require(['jquery', 'lib1','lib2'], function($, l1,l2) {
var thisVariableHoldsStateBetweenModules = "initValue"
var thisIsTheAPIOfYourModule = function(newValue) {
thisVariableHoldsStateBetweenModules = newValue
}
var getInternalState = function () {
return thisVariableHoldsStateBetweenModules
}
return {
set: thisIsTheAPIOfYourModule,
get: getInternalState
}
}
})
Когда вам требуется этот модуль, вы получаете обратно thisIsAPIOfYourModule
, так что вы можете просто использовать его для изменения thisVariableHoldsStateBetweenModules
:
otherMod.js
require(['stateMod'], function(stateMod) {
stateMod.set("Hello world")
})
и позже, в модуле nextMod.js:
require(['stateMod'], function(stateMod) {
stateMod.get() // outputs Hello World
})
requirejs сохраняет объект, возвращенный при первом запросе, и именно поэтому вы не загружаете повторно (через сеть) d3js и jQuery или другие распространенные библиотеки каждый раз, когда они вам нужны в модуле, иначе это было бы довольно дерьмово.
Попробуйте это и дайте мне знать, как это сработало у вас.