Подтвердить что ты не робот

Проверьте, есть ли что-то модель или коллекция в магистральном js

Когда вы переопределяете базовую синхронизацию, модель/коллекция .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
}

Я полагаю, что я ищу "безопасную" лучшую практику, я мог бы, конечно, проверить определенные атрибуты или методы, которые есть только у модели или коллекции, но, похоже, это хаки, разве не должно быть более очевидного пути? И, вероятно, я просто не мог его найти.

Спасибо!

4b9b3361

Ответ 1

Вы также можете попробовать instanceof следующим образом:

Backbone.sync = function(method, model, options) {
  if (model instanceof Backbone.Model) {
    ...
  } else if (model instanceof Backbone.Collection) {
    ...
  }
}

Ответ 2

@Ответ 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

Ответ 3

Это так же хакерски, но коллекция Backbone имеет свойство модели, а модель не имеет - сама по себе модель.

Возможно, более безопасный метод - model.toJSON() и посмотреть, является ли результат объектом или массивом. Вероятно, вы, вероятно, собираетесь использовать model.toJSON() в своем пользовательском Backbone.sync, поэтому, хотя это довольно дорогостоящее вычисление, все равно это произойдет.

Ответ 4

Вы можете сделать что-то вроде этого.

Backbone.Model.prototype.getType = function() {
    return "Model";
}

Backbone.Collection.prototype.getType = function() {
    return "Collection";
}

if(model.getType() == "Model") {}
if(model.getType() == "Collection"){}

Ответ 5

Я не совсем уверен, как я к этому отношусь, потому что это кажется немного хакерским, но я не могу точно подумать, почему в этот момент было бы очень плохо.

Определенно простой и быстрый, чем проверка "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; }