2011-07-01 18 views
1

モデル内にあるモデルの順序を維持し、モデルに保存してサーバーに保存できるようにする必要があります。個々のモデルを保存することができますが、コレクションを含む「親モデル」を保存すると、コレクションを保持する属性が保存されるようになりました。コレクションを少なくともbackbone.jsに保存するには

これを行う方法はありますか?以下は私のコードです。私はそれがおそらく最高ではないことを知っています、私はまだ学んでいます。

<!DOCTYPE HTML> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    <script type="text/javascript" src="jquery.js"></script> 
    <script type="text/javascript" src="jquery-ui.js"></script> 
    <script type="text/javascript" src="json2.js"></script> 
    <script type="text/javascript" src="underscore-min.js"></script> 
    <script type="text/javascript" src="backbone-min.js"></script> 
    <script type="text/javascript"> 
     $(function() { 
      var WO = Backbone.Model.extend({ 
       wonum: null, 
       part: null, 
       desc: null, 
       initialize: function() 
       { 
        this.url = '/rest/wo/'+this.get('wonum'); 
       } 
      }); 

      var WOView = Backbone.View.extend({ 
       tagName: "tr", 
       className: "wo", 
       initialize: function(options) 
       { 
        this.render = _.bind(this.render, this); 
       }, 
       render: function() 
       { 
        $(this.el).html("<td>"+this.model.get('wonum')+"</td><td>"+this.model.get('part')+"</td><td>"+this.model.get('desc')+"</td>"); 
        return this; 
       } 
      }); 


      var WOs = Backbone.Collection.extend({ 
       model: WO, 
       url: '/rest/section/wos/' 
      }); 

      var Section = Backbone.Model.extend({ 
       defaults: { 
        name : "Section" 
       }, 
       wos: [], 
       url: '/rest/section/', 
       initialize: function() 
       { 
        this.wos = new WOs(); 
        this.wos.url += this.id; 
        this.url += this.id; 
       } 
      }); 

      var SectionView = Backbone.View.extend({ 
       tagName: "table", 
       initialize: function() 
       { 
        _(this).bindAll('add','remove'); 
        var that = this; 
        this._woViews = []; 

        this.model.wos.each(this.add); 

        this.model.wos.bind('add', this.add); 
       }, 
       add: function(woObj) 
       { 
        var wov = new WOView({ 
         model: woObj, 
         id: woObj.get('wonum')}); 
        this._woViews.push(wov); 
        if(this._rendered) 
         $(this.el).append(wov.render().el); 
        this.model.save(); 
       }, 
       render: function() 
       { 
        this._rendered = true; 
        var that = this; 
        $(this.el).empty(); 
        $(this.el).append("<thead><th>WO</th><th>Part</th><th>Desc</th></thead>"); 
        $(this.el).append("<tbody>"); 
        _(this._woViews).each(function(wov) 
        { 
         $(that.el).append(wov.render().el); 
        }); 
        $(this.el).append("</tbody>"); 
        return this; 
       } 
      }); 

      var sec = new Section({id: 1}); 
      sec.wos.add({ 
       wonum: 1001, 
       part: 'p1001', 
       desc: 'd1001'}); 
      sec.wos.add({ 
       wonum: 1002, 
       part: 'p1002', 
       desc: 'd1002'}); 
      var secv = new SectionView({model: sec, id: sec.get('id')}); 
      $("body").append(secv.render().el); 
      $("#addwo").bind("click",function() 
      { 
       secv.add(new WO({ 
        wonum: 1005, 
        part: 'p1005', 
        desc: 'd1005'})); 
      }); 
     }); 
    </script> 
</head> 
<body> 
<button id='addwo'>Add WO</button> 
</body> 
</html> 

答えて

1

コレクションの順序を保持するためにコレクションのコンパレータ関数(設定可能)を使用することを検討します。このコンパレータは、モデルのプロパティを潜在的に使用します。たとえば、モデルの名前や位置プロパティーなどです。

この方法を使用すると、各モデルを独立して保存するだけで、コレクションが潜在的にリフレッシュされる可能性があります(コンパレータを使用して希望の順序を保持する)。

+0

私の問題は、使用できるモデルにプロパティがないことです。要素は、ページ上でユーザーによって再配置されます。私はそれを働かせることができると思うが、コレクションに入ったらモデルを変更することに問題がある。 – Jason

+0

私はそれを働かせた、決して気にしない。 – Jason

関連する問題