2013-04-08 61 views
0

模板我有一個JSON像這樣的問題的集合:獲得一個模型的子集與下劃線和骨幹

{ 
      "id": "505", 
      "issuedate": "2013-01-15 06:00:00", 
      "lastissueupdate": "2013-01-15 13:51:08", 
      "epub": false, 
      "pdf": true, 
      "price": 3, 
      "description": "Diese Version ist nur als PDF verfügbar.", 
      "downloadable": true, 
      "renderings": [ 
       { 
        "height": 976, 
        "width": 1024, 
        "sourcetype": "pdf", 
        "pagenr": 0, 
        "purpose": "newsstand", 
        "relativePath": null, 
        "size": 0, 
        "url": "a/url/image.jpg" 
       }, 
       { 
        "height": 488, 
        "width": 512, 
        "sourcetype": "pdf", 
        "pagenr": 0, 
        "purpose": "newsstand", 
        "relativePath": null, 
        "size": 0, 
        "url": "a/url/image.jpg" 
       } 
} 

我使用的骨幹,我要訪問的子元素(效果圖)。 我覆蓋瞭解析方法,告訴我的'渲染'是一個新的集合,這部分工作正常。 我遇到一些問題的時候是我將我的問題集合傳遞給我的模板。然後,我可以針對每個問題和訪問他的屬性(ID,發佈,lastissueupdate等)做出答案,但是如何訪問我的問題的呈現?

筆者認爲:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'text!templates/home/homeTemplate.html', 
    'collections/issues/IssueCollection' 
], function($, _, Backbone, homeTemplate, IssueCollection){ 

    var HomeView = Backbone.View.extend({ 
    el: $("#page"), 

    initialize:function(){ 
     var that = this; 


     var onDataHandler = function(issues){ 
     that.render(); 


     } 
     this.issues = new IssueCollection(); 
     this.issues.fetch({ 
     success:onDataHandler, 
     error:function(){ 
      alert("nicht gut") 
     } 
     }); 
    }, 

    render: function(){ 

     $('.menu li').removeClass('active'); 
     $('.menu li a[href="#"]').parent().addClass('active'); 
     var compiledTemplate = _.template(homeTemplate, {_:_, issues: this.issues.models}); 
     this.$el.html(compiledTemplate); 

    } 

    }); 

    return HomeView; 

}); 

然後,我有一個很基本的模板。

要恢復,我有一個包含RENDERINGS集合的模型ISSUE的集合問題,我想訪問模板中的模型RENDER。

編輯: IssueCollection

define([ 
    'underscore', 
    'backbone', 
    'models/issue/IssueModel' 
], function(_, Backbone, IssueModel){ 

    var IssueCollection = Backbone.Collection.extend({ 

     model: IssueModel, 

     url: function(){ 
      return '/padpaper-ws/v1/pp/fn/issues'; 
     }, 

     parse: function(response){ 
      return response.issues; 
     } 

     //initialize : function(models, options) {}, 

    }); 
    return IssueCollection; 
}); 

IssueModel

define([ 
    'underscore', 
    'backbone', 
    'collections/renderings/RenderingsCollection' 
], function(_, Backbone, RenderingsCollection) { 

    var IssueModel = Backbone.Model.extend({ 
    parse: function(response){ 
     response.renderings = new RenderingsCollection(response.renderings); 
     return response; 
    }, 
    set: function(attributes, options) { 
     if (attributes.renderings !== undefined && !(attributes.renderings instanceof RenderingsCollection)) { 
     attributes.renderings = new RenderingsCollection(attributes.renderings); 
     } 
     return Backbone.Model.prototype.set.call(this, attributes, options); 
    } 
    }); 
    return IssueModel; 
}); 

RenderingsCollection

define([ 
    'underscore', 
    'backbone', 
    'models/rendering/RenderingModel' 
], function(_, Backbone, RenderingModel){ 

    var RenderingsCollection = Backbone.Collection.extend({ 

     model: RenderingModel 

     //initialize : function(models, options) {}, 

    }); 
    return RenderingsCollection; 
}); 

RenderingModel

define([ 
    'underscore', 
    'backbone' 
], function(_, Backbone) { 

    var RenderingModel = Backbone.Model.extend({ 

    return RenderingModel; 

}); 

感謝的!

+0

我看不到模型RENDER,它是_renderings_的父對象? – 2013-04-08 13:05:18

+0

*我有這樣的JSon,這是一個問題的集合:*我會說這只是一個問題,而不是一個集合。 – Loamhoof 2013-04-08 13:05:32

+0

@Loamhoof,這只是第一個,還有很多其他的。 – brunettia 2013-04-08 13:08:54

回答

0

其實我可以在我的模板中使用雙_.each這樣,從視圖中給我的模型。

<% _.each(issues, function(issue) { %> 
    .... code ... 
    <% _.each(issue.get('renderings'), function(rendering) { %> 

然後進入我的渲染屬性,我們這樣做:

<%= rendering.url %> 

例如,而不是「得到」像第一次。

感謝您的參與!

0

您可以使用Collection#toJSON方法來完整地表示整個數據。但是,您必須使用model.attributes.key來訪問模型的屬性。所以我不會推薦它。相反,我會說你應該建立自己的JSON對象(遞歸地使用toJSON方法)。 (我會用一些代碼更新,如果現在還不清楚)

編輯:

var data = [], renderings; 
for(var i=0; i<issues.length; i++) { 
    data.push(issues.models[i].toJSON()); 
    data[i].renderings = []; 
    renderings = issues.models[i].get('renderings'); 
    for(var j=0; j<renderings.length; j++) { 
    data[i].renderings.push(renderings.models[j].toJSON()); 
    } 
} 

例如會給你整個數據,你可以輕鬆地訪問任何屬性。

+0

我不明白這怎麼能救我:)(我很新...)如果你可以舉一個小例子來訪問每個渲染圖,那將是非常好的! – brunettia 2013-04-08 13:21:48

+0

基本上,這段代碼會給你的問題的整個JSON表示,沒有骨幹的內部東西。所以...或多或少是你在問題中顯示的JSON對象。只需測試它和'console.log(data);'。你會看到它的樣子。 – Loamhoof 2013-04-08 13:25:02