Как я понимаю, ваши основные вопросы таковы:
- Как мы получим экземпляр модели конфигурации?
- Как мы будем использовать модель конфигурации для установки
url
зависимой модели?
- Как мы можем убедиться, что мы не используем функцию
url
в зависимой модели слишком рано?
Есть много способов справиться с этим, но я собираюсь предложить некоторые особенности, чтобы я мог просто предоставить руководство и код и, так сказать, «сделать это».
Я думаю, что лучший способ справиться с первой проблемой — сделать эту модель конфигурации одноэлементной. Я предоставлю код из backbone-singleton Страница GitHub ниже, но я не хочу, чтобы ответ был длинным по вертикали, пока я не закончу объяснение, поэтому читайте дальше...
var MakeBackboneSingleton = function (BackboneClass, options) { ... }
Затем мы создаем одноэлементное свойство AppConfiguration
, а также свойство deferred
, используя преимущество jQuery
. Результат fetch
даст always(callback)
, done(callback)
и т. д.
var AppConfiguration = MakeBackboneSingleton(Backbone.Model.extend({
defaults: {
base: null
},
initialize: function() {
this.deferred = this.fetch();
},
url: function() {
return 'config.json'
}
}));
Теперь пришло время определить зависимую модель DependentModel
, похожую на вашу. Он вызовет AppConfiguration()
, чтобы получить экземпляр.
Обратите внимание, что из-за MakeBackboneSingleton
следует все true
:
var instance1 = AppConfiguration();
var instance2 = new AppConfiguration();
instance1 === instance2; // true
instance1 === AppConfiguration() // true
Модель будет автоматически fetch
при предоставлении id
, но только после завершения выборки AppConfiguration
. Обратите внимание, что вы можете использовать always
, then
, done
и т. д.
var DependentModel = Backbone.Model.extend({
initialize: function() {
AppConfiguration().deferred.then(function() {
if (this.id)
this.fetch();
});
},
url: function() {
return AppConfiguration().get('base') + '/someEndpoint';
}
});
Теперь, наконец, собрав все это воедино, вы можете создавать экземпляры некоторых моделей.
var newModel = new DependentModel(); // no id => no fetch
var existingModel = new DependentModel({id: 15}); // id => fetch AFTER we have an AppConfiguration
Второй будет автоматически загружаться до тех пор, пока выборка AppConfiguration
будет успешной.
Вот вам MakeBackboneSingleton
(опять же из репозитория GitHub):
var MakeBackboneSingleton = function (BackboneClass, options) {
options || (options = {});
// Helper to check for arguments. Throws an error if passed in.
var checkArguments = function (args) {
if (args.length) {
throw new Error('cannot pass arguments into an already instantiated singleton');
}
};
// Wrapper around the class. Allows us to call new without generating an error.
var WrappedClass = function() {
if (!BackboneClass.instance) {
// Proxy class that allows us to pass through all arguments on singleton instantiation.
var F = function (args) {
return BackboneClass.apply(this, args);
};
// Extend the given Backbone class with a function that sets the instance for future use.
BackboneClass = BackboneClass.extend({
__setInstance: function () {
BackboneClass.instance = this;
}
});
// Connect the proxy class to its counterpart class.
F.prototype = BackboneClass.prototype;
// Instantiate the proxy, passing through any arguments, then store the instance.
(new F(arguments.length ? arguments : options.arguments)).__setInstance();
}
else {
// Make sure we're not trying to instantiate it with arguments again.
checkArguments(arguments);
}
return BackboneClass.instance;
};
// Immediately instantiate the class.
if (options.instantiate) {
var instance = WrappedClass.apply(WrappedClass, options.arguments);
// Return the instantiated class wrapped in a function so we can call it with new without generating an error.
return function () {
checkArguments(arguments);
return instance;
};
}
else {
return WrappedClass;
}
};
person
tacos_tacos_tacos
schedule
06.08.2015
Backbone.sync
. - person hindmost   schedule 06.08.2015backbone-associations
илиbackbone-relational
, чтобы сделать то же самое в более общем плане. Но стратегия хорошая — он говорит, если отсутствуют зависимости, вернутьfalse
изsync
, а иначе составить из них. - person tacos_tacos_tacos   schedule 07.08.2015backbone-associations
, то я просто создам связь 1:1 междуConfig
иModelA
, и при выборке дляModelA
Config
также будет получен и доступен дляModelA
? - person lbrahim   schedule 07.08.2015