2015-10-20 45 views
1

基本上我想获取JSON文件并将其存储在模型中。但是,当我尝试通过get()访问属性时,它返回undefined。所以可以说JSON文件有一个由具有一些属性的对象组成的数组游戏。它并不重要。只是想将它们保存在模型中并访问它们。所以我正在做这样的事情。Backbone.js fetch()JSON模型get()回归undefined

var player = Backbone.Model.extend({ 
    initialize: function(app, options) { 
     this.app = app; 
     var _this = this; 

     this.fetch({ 
     url: "someurl", 
     success: function() { 
      console.log("success"); 
     } 
     }); 
    } 
}); 

var instplayer = new player(); 
instplayer.on('change', function(){ 
    console.log(model); 
    console.log(model.get(games)); 
}) 

所以我想,我需要一个事件来确保当数据真的可用get()被调用。但是这仍然返回undefined。我需要做什么?谢谢。

+0

你的意思是你取的球员,而且也多维数据,包含游戏吗?是这样的: '{username:“joe”,games:[{title:“Game One”},{title:“Game Two”}}}' 然后你只想访问'games'属性, 是对的吗? – Yura

+0

是的,这是正确的。只要我能从JSON数据中获取任何东西。我的意思是当我通过console.log查看对象时看到数据,但get()只是简单地返回undefined。当然,我可以毫无问题地返回带有默认选项的模型的一些值。 – riasc

+0

在确定你将'.get'方法传递给''model.get(“games”)'的引号后,我还建议使用'sync'事件而不是'change'。当内容来自服务器时,'sync'将确保触发。 “change”会触发对该模型数据的任何更改,这可能比您想要的更频繁。 – Yura

回答

1

所以我想像你有一个JSON您的播放器这样的(我嘲笑它here为下面的示例工作):

{ 
    "username": "joe", 
    "games": [ 
     { 
      "title": "Pacman" 
     }, { 
      "title": "Super Mario" } 
    ] 
} 

而这里的我会怎样处理一个完整的工作示例管理和渲染这种数据:

var Game = Backbone.Model.extend({ 
 
    defaults: { 
 
    title: '' 
 
    } 
 
}); 
 

 
var Games = Backbone.Collection.extend({ 
 
    model: Game 
 
}); 
 

 
var Player = Backbone.Model.extend({ 
 
    defaults: { 
 
    username: '' 
 
    }, 
 
    url: 'http://www.mocky.io/v2/56261127250000a01accb34f', 
 
    initialize: function(){ 
 
    this.games = new Games(); 
 
    this.listenTo(this, "sync", this.initGames); 
 
    this.fetch(); 
 
    }, 
 
    initGames: function(){ 
 
    this.games.add(this.get('games')); 
 
    this.trigger('ready', this); 
 
    } 
 
}); 
 

 
var PlayerView = Backbone.View.extend({ 
 
    template: _.template('<h1><%=username%></h1> and his games: <ol class="games"></ol>'), 
 
    render: function(){ 
 
    this.$el.html(this.template(this.model.toJSON())); 
 
    this.model.games.each(this.renderGame, this); 
 
    return this; 
 
    }, 
 
    renderGame: function(game, i){ 
 
    var gameView = new GameView({ model: game }); 
 
    gameView.render().$el.appendTo(this.$('.games')); 
 
    } 
 
}); 
 

 
var GameView = Backbone.View.extend({ 
 
    tagName: 'li', 
 
    template: _.template('<strong>Game:</strong> <%=title%>'), 
 
    render: function(){ 
 
    this.$el.html(this.template(this.model.toJSON())); 
 
    return this; 
 
    } 
 
}); 
 

 

 
var dude = new Player(); 
 
dude.on('ready', function(player){ 
 
    var playerView = new PlayerView({ model: player }); 
 
    playerView.render().$el.appendTo(document.body); 
 
});
<script src='http://code.jquery.com/jquery.js'></script> 
 
<script src='http://underscorejs.org/underscore.js'></script> 
 
<script src='http://backbonejs.org/backbone.js'></script>

+0

太棒了。非常感激。这正是我需要的。漂亮的天才,将一个集合添加到模型。不知道这甚至是可能的。谢谢。 – riasc

0

我不知道这是否是一个错字或无吨,但你不及格modelcallback

instplayer.on('change', function(){ 
    console.log(model); 
    console.log(model.get(games)); 
}) 

应该

instplayer.on('change', function(model, options){ 
    console.log(model); 
    console.log(model.get("games")); 
}) 

然后games必须是string不是variable

我建议你要注意的另一件事是json返回;有时您必须重写parse函数才能得到确切的结果。

再次,如果你取一个array,而不是一个单一的对象,也许你应该使用collectionplayers

+0

感谢您的回答。是的,这确实是一个错字。除了这段代码之外,你的建议应该让我回到阵列吗?我尝试了一个集合,然后简单地做了'parse:function(response){return response.games; }'这也填充集合,但我不知何故无法访问填充的属性。 – riasc

+0

你给'collection'分配了一个'model'吗? – steo

+0

感谢您的提示。 – riasc