2013-03-06 2 views
0

다음과 같은 모드/수집 /보기 설정이 백본에 있습니다.백본 컬렉션에서 CID로 모델을 가져올 수 없습니다.

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) 

      }); 
     } 
}); 

나는 sortable 함수에서 MAINVIEW의 컬렉션에서 모델을 얻을하려고 할 때이 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 콜백 로깅 시도했지만 난 아직도 반환 정의되지 않은 얻을 ... 각 모델은 고유의 식별자를 가지고있다. 어떤 도움이라도 대단히 감사합니다. collection.get가 인수로 모델 ID를 예상하기 때문에

+1

'cid' 속성이 문제의 DOM 요소에 실제로 첨부되어 있는지 확인 했습니까? jsFiddle을 만들 수 있습니까? – Ben

답변

0
  • 당신이 self.collection.get(cid)에 전달하는 cid이 모델 중 하나의 ID입니다 확인합니다. 이 목적으로 cid 값을 기록 할 수도 있습니다.
3

메서드는 id 또는 cid 중 하나를 허용합니다. idget으로 직접 전달 될 수 있지만 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 백본 0.9.9 이상에서 .get() 메소드로 전달 될 수있다 (implementation in the current 1.3.3 참조). 귀하의 경우에는

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

이 문제가 "CID"속성의 가능성이 Ben로, 카드 요소 누락 씁니다. .append() 메서드를 사용하여이 특성을 새 요소에 추가했지만 대신 .render() 메서드를 호출했습니다. 로그에 undefined이 있으므로보기에서 column보기가 속성을 추가하지 않는 것으로 보입니다.

참고 : 예를 들어 'cid'대신 'data-cid'와 같은 유효한 맞춤 HTML 속성 이름을 사용하는 것이 좋습니다. 우리가 휴식없이 가짜 모델을 만들고 컬렉션에 밀어하려는 하나 개의 컬렉션에 differents의 모델을 밀어 모든 요청 anly 개인 또는 어쩌면 REST 반환 해달라고 ID의 ATTR에 대해 고유 한 ID를 응답하지 나머지는 나

+0

현재 버전의 Backbone (v1.3.3)에서는 이것이 사실이 아닙니다. cid를 실제로 .get() 메소드에 직접 전달할 수 있습니다. –

0

CID를 사용

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); 
    }); 
});