1

我正在尝试删除我在主干中创建的模型。我并不是要取消模型本身。

这就是我所拥有的:首先对代码进行茉莉花单元测试

    it("should delete the current Box ", function () {
        var myContainer = new App.Container();
        var myBox = new App.Box();
        myBox.setTitle("The First Box");
        expect(myBox.attributes.title).toBeDefined();
        **myContainer.deleteBox(myBox);**

        expect(myBox.attributes.title).toBeUndefined();
    });

现在代码:

App.Container = Backbone.Model.extend({

    defaults: {
        type: "1.0",
        selectedBox: 0,
        boxes: [],
        labels: [],

    },

    deleteBox: function () {
        this.destroy({
            success: function() {
                console.log("the box has been removed");
                //Array reindexed
            }
        });
    }
});

这没用。茉莉花单元测试失败,我想我必须了解如何删除骨干给出的 cid 处的对象。我不知道该怎么做。有什么建议么?

4

1 回答 1

1
  1. 看起来您在使用 Container 时误用了 Backbone 模型。让盒子成为一个有自己的模型的视图,容器是一个分配了盒子集合的视图,并通过创建和管理你的盒子进行迭代,这将是更好的做法。您可以将侦听器分配给集合以选择何时删除框。

  2. 您调用myContainer.deleteBox(myBox);,但没有收到作为参数传递的框!

更新

作为对您的说明的回应,我确实理解 - 确实需要一些头脑来适应 Backbone 中的概念。

如果我了解您要做什么,这里有一些示例代码,您可以仔细阅读,可以更好地了解如何完成此类事情:

App.Boxes = Backbone.Collection.extend({}) 
App.Box = Backbone.View.extend({});        // Child view for each model
App.Container = Backbone.View.extend({     // 'Collection view', that draws 
                                           // each child view.
  tagName: 'div',
  
  initialize: function(){
    
    this.boxes = {};

    // Assign event listeners to redraw DOM when your models change.
    this.listenTo(App.boxes, 'add', this.addBox);
    this.listenTo(App.boxes, 'remove', this.removeBox);
    
  },
  
  // Create a new box when a new model is added to the collection.
  addBox: function(model) {

    var newBox = new App.Box({ model: model });

    this.boxes[model.cid] = newBox;
    this.$el.append(newBox.render().el);

    },
  
  // Remove a box when a model is removed from the collection.
  removeBox: function(model) {
    var box = this.boxes[model.cid];
    box.remove();
  },
  

});

// Let's make the parent view.
var myContainer = new App.Container();
$(body).append(myContainer.render().el);

// Make a new collection
App.boxes = new App.Boxes();

// Add models to the collection
App.boxes.add({ title: 'The First Box', });
App.boxes.add({ title: 'The Second Box', });

// Remove a model from the collection.
App.boxes.findWhere({ title: 'The First Box' }).remove();

这有帮助吗?

于 2013-09-29T20:21:50.103 回答