2016-03-10 4 views
1

В моем проекте Titanium Alloy Appcelerator, я пытаюсь переопределить model.destroy(), чтобы удалить фотографии, связанные с моделью. Мой код удаляет фотографии просто отлично, но на самом деле не удаляет модель. Что я делаю не так?Overriding destroy(), чтобы удалить фотографии, связанные с моделью, не удаляет сама модель

_.extend(Model.prototype, { 
    destroy: function (options) { 
     // override default destroy method to also remove photos 
     console.log('destroying the model'); 
     var model = this; 
     options = options ? _.clone(options) : {}; 
     var photos = JSON.parse(model.get('photos')); 
     photos.forEach(function (photo) { 
      console.log("Deleting photo: " + photo); 
      var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, photo); 
      f.deleteFile(); 
     }); 
     model.trigger('destroy', model, model.collection, options); 
    } 
}); 

Я вижу операторы журнала консоли, и фотографии удаляются. Но модель остается.

Некоторые вещи, которые я пробовал, но безуспешно:

В мой контроллер, вызывая оба эти:

model.destroy(); 
collection.remove(model); 
// also collection.remove([model]); 

Я попытался добавить это мой расширенный уничтожить функцию, но он не сделал работа

... 
    f.deleteFile(); 
}); 
model.collection.remove(model); 
// and model.collection.remove([model]); 
model.trigger('destroy', model, model.collection, options); 

Приведенная ниже модель разрушена, но мой код не работает, и фотографии не удаляются.

_.extend(Model, { 
... 
+0

Это, кажется, работает как есть, https://jsfiddle.net/nikoshr/Lyvn6dep/, по крайней мере, без титана – nikoshr

+0

кажется, конкретно не только титан, но, возможно, на прошивке, а также. – skypanther

ответ

1

Попробуйте это внутри объекта Model, а не прототипа.

destroy: function (options) { 
    // override default destroy method to also remove photos 
    console.log('destroying the model'); 
    var model = this; 
    options = options ? _.clone(options) : {}; 
    var photos = JSON.parse(model.get('photos')); 
    photos.forEach(function (photo) { 
     console.log("Deleting photo: " + photo); 
     var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, photo); 
     f.deleteFile(); 
    }); 
    Backbone.Model.prototype.destroy.call(this); 
} 
+0

Спасибо, это работает! Для тех, кто смотрит на это позже, ключевым отличием является вызов Backbone.Model.prototype.destroy.call (this); 'в конце, а не' model.trigger() 'И обратите внимание, что код Эрика войдет в' _ .extend ({}) 'вызов в определении модели. – skypanther

0

только предположение: любой шанс, что options передается вашей расширенной destroy(...) методы включает { wait: true }? Если это так, модель не будет удалена из коллекции until the server responds with a sync event.

То, как вы переопределили destroy(...), этого никогда не произойдет.

 Смежные вопросы

  • Нет связанных вопросов^_^