Как удалить зависимую модель из той же коллекции в backbone.js

У меня есть модель, в которой есть как navid, так и subnavid. При уничтожении модели мне нужно проверить всю коллекцию, для других моделей, у которых navid такой же, как и subnavid модели, которую я пытаюсь удалить. Пожалуйста, помогите мне. Заранее спасибо . Вот мой пример кода.

Модель:

var Node = Backbone.Model.extend({ по умолчанию: {NavId: '', SubNavId: ''. ItemName:'' } }

Коллекция:

var NodeCollection = Backbone.Collection.extend({ model:Node }

И у меня есть два вида: один для узла (я создаю tr), а другой для коллекции (мне нужно построить таблицу) var NodeCollectionView = Backbone.View.extend({

initialize: function (options) {
    var self = this;      self.collection = new NodeCollection({ NavigationId: options.NavigationId });
    self.collection.fetch({
        success: function () {
            /*I am getting  hte proper collection from my restful api and iam able to bind it properly
          self.render();
        }
    });
},

render: function () {
    var that = this;
    _.each(this.collection.models, function (item) {
        that.RenderEachNode(item);
    }, this);
},

RenderEachNode: function (item) {
    var TempJsonNode = item.toJSON();
    var self = this;
    var nodeView = new NodeView({
        tagName: 'tr',
        id: 'NavId_' + TempJsonNode.NavItemId,
        model: item
    });
} });
var ItemTemplate = ""; ItemTemplate += "    <td>"; ItemTemplate += "        <a><%= ItemName %></a>"; ItemTemplate +="   </td>"; ItemTemplate
+=" <td>"; ItemTemplate +="         <a href='#' original-title='Delete ' class='tip_north Delete'>X</a>"; ItemTemplate +="  </td>  ";           


var NavigationItemView = Backbone.View.extend({
    template: ItemTemplate,
    render: function () {
        var self = this;
        var tmpl = _.template(this.template);
        this.$el.html(tmpl(this.model.toJSON()));
        return this;
    },
    events: {
        "click .Delete": "DeleteBtnClick"
    },
    DeleteBtnClick: function () {
        var self = this;
        self.model.destroy({
            success: function (status, data) {
                var RetData = JSON.parse(data);
                if (RetData.Status == 'Success') {
                    $(self.el).remove()
                }
            },
            error: function () {
                alert('Error In Deleting The Record');
            }
        });
        return false;
    } });

Я могу правильно построить таблицу, но при уничтожении модели я не нахожу способ уничтожить зависимые модели. Мой API ограничен таким образом, что я не могу получить вложенный json (если бы это было так, я бы сделал с магистральное отношение). поэтому мне нужно каким-то образом выяснить, что другие модели и представления, которые имеют NavId модели, удаляются.

Пожалуйста, помогите мне.


person Arun Kumar    schedule 06.02.2013    source источник


Ответы (1)


Как насчет чего-то вроде:

var NodeView = Backbone.View.extend({
  initialize: function() {
    //when the model gets destroyed, remove the view
    this.listenTo(this.model, 'destroy', this.remove);
  },
  //..clip
  DeleteBtnClick: function () {
    var self = this;
    var collection = self.model.collection;
    var navId = self.model.get('NavId');

    self.model.destroy({
      success: function (status, data) {
        var RetData = JSON.parse(data);
        if (RetData.Status == 'Success') {
          //if parent was part of a collection
          if (collection) {
            //find related models
            var related = collection.filter(function (model) {
              return model.get('SubNavId') === navId;
            });

            //call destroy for each related model.
            var promises = _.invoke(related, 'destroy');

            //optional: if you want to do something when all the children
            //are destroyed:
            $.when.apply($, promises).then(function () {
              console.log('all destroyed');
            });
          }
        }
      },
      error: function () {
        console.log(arguments);
        alert('Error In Deleting The Record');
      }
    });
    return false;
  }
});

Изменить: JSFiddle здесь

person jevakallio    schedule 06.02.2013
comment
Привет, Фенклифф, я новичок в backbone js, я подготовлю небольшую скрипку, не могли бы вы изменить ее и показать мне? - person Arun Kumar; 06.02.2013
comment
@ArunKumar, я могу посмотреть. Если я смогу сделать это за короткое время, я это сделаю. - person jevakallio; 06.02.2013
comment
@ArunKumar, JSFiddle работает очень медленно. Я посмотрю на это позже, когда у меня будет время. - person jevakallio; 06.02.2013
comment
@ArunKumar добавил скрипку в пост и обновил код. Надеюсь это поможет. - person jevakallio; 06.02.2013
comment
я не могу найти никаких изменений в скрипке - person Arun Kumar; 06.02.2013
comment
@ArunKumar, проверь ссылку в моем ответе. - person jevakallio; 06.02.2013
comment
спасибо за предоставленный код. но в коде есть один небольшой сбой, например, электроника имеет корень, если я удалю электронику, тогда все tr должны удалиться. но это не работает, это работает только до одного уровня. - person Arun Kumar; 06.02.2013
comment
@АрунКумар, о. Я больше не сижу перед своим компьютером и не буду некоторое время. Мне кажется, вам нужно перенести логику удаления на уровень модели. - person jevakallio; 06.02.2013
comment
хорошо, я попробую это. большое спасибо за оказанную помощь. если я не смогу этого сделать, я вернусь к вам. Спасибо - person Arun Kumar; 06.02.2013
comment
Привет, я попробовал то, что вы мне сказали, и теперь я могу создать список и удалить его, как я и ожидал. Спасибо за помощь .. Теперь у меня есть другое требование, где привязка tr будет иметь последовательность .. на основе последовательности мне нужно найти tr, для которого я должен добавить недавно сгенерированный tr html... - person Arun Kumar; 08.02.2013
comment
@ArunKumar, может быть, открыть еще один вопрос об этом? И, пожалуйста, отметьте этот вариант принятым, если он работает. - person jevakallio; 08.02.2013
comment
пожалуйста, проверьте это stackoverflow.com/questions/14769378/ - person Arun Kumar; 08.02.2013