Чистый метод совместного использования объекта (или состояния) между модулями с AMD и магистралью

#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 или другие распространенные библиотеки каждый раз, когда они вам нужны в модуле, иначе это было бы довольно дерьмово.

Попробуйте это и дайте мне знать, как это сработало у вас.