用json编码的php数组填充Backbone集合


Populate Backbone collection with json encoded php array

我正在做一个简单的测试。从json编码的php数组填充一个Backbone集合。

var MyObjectModel = Backbone.Model.extend({
    parse:function(response){
        return JSON.parse(response);
    }
});
var MyObjectView = Backbone.View.extend({
    template: _.template('<a id="<%= id %>" href="#"><%= name %></a>    '),
    render: function(){
        this.$el.html(this.template(this.model.attributes)); 
        return this;
    }
});
var MyList = Backbone.Collection.extend({
    url: 'testRest.php',
    model: MyObjectModel
});
var MyListView = Backbone.View.extend({
    el:$("#app"),
    initialize: function(){
        this.collection.on('add',this.addOne,this);
        this.collection.on('reset',this.addAll,this);
    },
    addOne: function(objectModel){
        var objectView = new MyObjectView({model: objectModel});
        this.$el.append(objectView.render().el);
    },
    addAll: function(){
        this.$el.empty();
        this.collection.forEach(this.addOne,this);
    },
    render: function(){
        return this;
    }
});
var myList = new MyList();
var myListView = new MyListView({collection:myList});
myList.fetch().done(function(){
    myListView.render();
});

HTML页面是尽可能基本的

<!DOCTYPE html>
<html>
    <head>      
        <title>TEST</title>
    </head>
    <body>
        <div id="app"></div>
        <script type="text/javascript" src="jquery-2.1.1.min.js"></script>  
        <script type="text/javascript" src="underscore-min.js"></script>    
        <script type="text/javascript" src="backbone-min.js"></script>  
        <script type="text/javascript" src="test2.js"></script> 
    </body>
</html>

当testst .php文件包含

时,它可以正常工作
echo json_encode("{'"id'":'"4'",'"name'":'"one'",'"color'":'"ff6600'",'"phoneNumber'":'"+123456789'"}");

但是当我试图在返回的对象中有多于一个项时:

echo json_encode("[{'"id'":'"4'",'"name'":'"one'",'"color'":'"ff6600'",'"phoneNumber'":'"+123456789'"},{'"id'":'"1'",'"name'":'"two'",'"color'":'"800080'",'"phoneNumber'":'"'"}]");

出现错误:

Uncaught ReferenceError: id is not defined

有人遇到同样的问题吗?我错过什么了吗?

你的主干代码没有问题,但你的php脚本做错了两件事:

1)设置Content-type报头为json2) json_encode接受php数组

<?php
header('Content-Type: application/json');
$resp = array(
    array(
        'id' => 4,
        'name' => 'one',
        'color' => 'ff6600',
        'phoneNumber' => '+123456789'
    ),
    array(
        'id' => 1,
        'name' => 'two',
        'color' => '80080',
        'phoneNumber' => ''
    )
);
echo json_encode($resp);

也正如我在评论中所说的,你不需要做JSON.parse, jQuery已经解析到一个对象,只要设置了Content-type头。parse的默认Backbone方法已经返回了响应对象,所以您根本不需要重写(除非您正在获取嵌套数据)。