Ответ 1
Вы также можете попробовать instanceof
следующим образом:
Backbone.sync = function(method, model, options) {
if (model instanceof Backbone.Model) {
...
} else if (model instanceof Backbone.Collection) {
...
}
}
Когда вы переопределяете базовую синхронизацию, модель/коллекция .save()/fetch() использует один и тот же метод базовой линии, поэтому лучше всего проверить, является ли то, что получает Backbone.sync, модель или набор моделей
В качестве примера:
Backbone.sync = function(method, model, options){
//Model here can be both a collection or a single model so
if(model.isModel()) // there is no isModel or isCollection method
}
Я полагаю, что я ищу "безопасную" лучшую практику, я мог бы, конечно, проверить определенные атрибуты или методы, которые есть только у модели или коллекции, но, похоже, это хаки, разве не должно быть более очевидного пути? И, вероятно, я просто не мог его найти.
Спасибо!
Вы также можете попробовать instanceof
следующим образом:
Backbone.sync = function(method, model, options) {
if (model instanceof Backbone.Model) {
...
} else if (model instanceof Backbone.Collection) {
...
}
}
@Ответ fiskers7 работает с глубоким расширением:
var Item = Backbone.Model.extend({
className : 'Item',
size :10
});
var VerySmallItem = Item.extend({
size :0.1
});
var item = new Item();
var verySmall = new VerySmallItem();
alert("item is Model ?" + (item instanceof Backbone.Model)); //true
alert("verySmall is Model ?" + (verySmall instanceof Backbone.Model)); //true
Это так же хакерски, но коллекция Backbone имеет свойство модели, а модель не имеет - сама по себе модель.
Возможно, более безопасный метод - model.toJSON() и посмотреть, является ли результат объектом или массивом. Вероятно, вы, вероятно, собираетесь использовать model.toJSON() в своем пользовательском Backbone.sync, поэтому, хотя это довольно дорогостоящее вычисление, все равно это произойдет.
Вы можете сделать что-то вроде этого.
Backbone.Model.prototype.getType = function() {
return "Model";
}
Backbone.Collection.prototype.getType = function() {
return "Collection";
}
if(model.getType() == "Model") {}
if(model.getType() == "Collection"){}
Я не совсем уверен, как я к этому отношусь, потому что это кажется немного хакерским, но я не могу точно подумать, почему в этот момент было бы очень плохо.
Определенно простой и быстрый, чем проверка "instanceof" (я предполагаю, что вы не назовете каких-либо других функций "isBBModel/Collection" на ваших объектах?)
Backbone.Model.prototype.isBBCollection = function() { return false; }
Backbone.Model.prototype.isBBModel = function() { return true; }
Backbone.Collection.prototype.isBBCollection = function() { return true; }
Backbone.Collection.prototype.isBBModel = function() { return false; }