2013-03-06 37 views
0

我在骨幹中有以下模式/集合/視圖設置。無法通過CID獲取Backbone集合中的模型

var Card = {}; 

//card model 
Card.Model = Backbone.Model.extend(); 


//collection 
Card.Collection = Backbone.Collection.extend({ 
    url: '/api/cards', 
    model: Card.Model 
}); 

//column view 
Card.MainView = Backbone.View.extend({ 
     className: 'column', 
     append: function(model) { 
      var view = Card.View.extend({ 
       model : model, 
       attributes: { cid : model.cid } 
      }); 
      var v = new view(); 
      this.$el.append(v.el);   
     }, 
     initialize: function() { 
      var self = this; 
      _.bindAll(this, "sortable"); 
      this.collection.fetch({ 
       success: function() { 
        self.render(); 
       } 
      }); 
     }, 
     render: function() { 
      var self = this; 
      for(var i = 0; i < this.columns.length; i++) { 
       var col = this.columns[i]; 
       var column = Card.ColumnView.extend({ 
        data: col, 
        cards: self.collection.where({ position : col.position }) 
       }); 
       var col = new column(); 
       this.$el.append(col.el); 
      }    
      this.sortable(); 
     }, 
     sortable: function() { 
      var self = this; 
      $(this.el).find('.card-container').sortable({ 
       connectWith: '.card-container', 
       receive: _.bind(function(event, ui) { 
        var cid = $(ui.item).attr('cid'); 
        var card = self.collection.get(cid); 
        //console.log(self.collection.last()); 
        console.log('cid', self.collection.get(cid)); 
        console.log('index 1', self.collection.at(1)); 
        console.log('last', self.collection.last()); 
        console.log('collection', self.collection); 
       }, this) 

      }); 
     } 
}); 

當我試圖讓從的MainView的收集模式在sortable功能也不會記錄由CID模型。我得到以下輸出。

cid undefined CardMetaCollection.js:97 
index 1 d {collection: d, attributes: Object, _escapedAttributes: Object, cid: "c2", changed: Object…} CardMetaCollection.js:98 
last d {collection: d, attributes: Object, _escapedAttributes: Object, cid: "c249", changed: Object…} CardMetaCollection.js:99 
collection d {length: 249, models: Array[249], _byId: Object, _byCid: Object, url: "/api/cards"…} 

我試圖記錄在success回調的獲取方法,但我還是得到了一個未定義返回......每個模型也有其自己的CID。任何幫助深表感謝。

+1

您是否確保'cid'屬性實際上被附加到相關的DOM元素上?你可以做一個jsFiddle嗎? – Ben 2013-03-06 17:08:57

回答

0
  • 確保cid要傳遞到self.collection.get(cid)是模型中的任何一個ID,因爲collection.get預計模型ID作爲參數。爲此,您可能還需要記錄cid值。
3

.get()方法接受idcidid可以直接傳遞到get,但cid必須作爲對象文字傳遞。實際上,您也可以將id傳遞給對象字面值,並使您的代碼保持一致。

var cid = ...; 
var card = self.collection.get({ cid: cid }); 

var id = ...; 
var card = self.collection.get({ id: id }); 

var id = ...; 
var card = self.collection.get(id); 

您可以查看backbone.js中的.get()實現。

UPDATE:單獨的cid可以被傳遞給.get()方法在骨幹0.9.9或更新的版本(見implementation in the current 1.3.3)。

var cid = ...; 
var card = self.collection.get(cid); 

在你的情況,問題很可能在屬性「CID」丟失卡上的元素,如Ben寫道。您聲明瞭一個.append()方法將此屬性添加到新元素,但您在.render()方法中調用new column()而不是它。看來,column視圖不會添加該屬性,因爲您的日誌記錄會找到它undefined

注意:例如,考慮使用有效的自定義HTML屬性名稱,如「data-cid」而不是「cid」。

+0

在當前版本的Backbone(v1.3.3)中,這不是真的--cid的確可以直接傳遞給.get()方法。 – 2016-10-20 20:48:31

0

CID使用,當你推型動物模型,一個收集和休息不是對所有的請求安良個人或也許REST不返回ID ATTR迴應唯一ID還是我們想不休息,以製造假模型,並將其推到收集

var banned = app.request('rest:banList'); 
    var whiteIp = app.request("rest:inviteList"); 
    var whiteGroup = app.request("rest:groupList"); 
      $.when(banned, whiteIp, whiteGroup).done(function (bannedList, whiteIpList, whiteGroupList) { 
       debugger 
       var arr = new Backbone.Collection(); 
       arr.add(bannedList); 
       arr.add(whiteIpList); 
       arr.add(whiteGroupList); 

      }); 

define(["app"], function (app) { 
    var API = { 
     getWho: function (data) { 
      var whois = new Backbone.Model(); 
      whois.url = '/admin/whois'; 
      whois.cid = 'ban'; 
      var defer = $.Deferred(); 

      whois.fetch({ 
       type: 'GET', 
       data: data, 
       success: function(data){ 
        debugger 
        defer.resolve(data); 
       }, 
       error: function(data){ 
        defer.reject(data); 
       } 
      }); 
      return defer.promise(); 
     } 
    }; 

    app.reqres.setHandler("rest:getWho", function (data) { 
     return API.getWho(data); 
    }); 
}); 
相關問題