backbone通过php与服务器进行数据交互

发布时间:2012-12-14 02:38:38

 

backbone通过save保存数据到服务器端,通过fetch从服务器端获取数据。两者执行时都会调用sync函数,而不会执行服务器端操作。因此,除非是自定义的sync操作(如采用websocket等非ajax方式提交),否则不需要覆盖sync函数。
问题1:php不能通过$_POST获取参数
save默认提交的是post方式,application/json的content-type,但是php的$_post只能接收Content-Type: application/x-www-form-urlencoded提交的数据,因此不能使用该方式获取参数。而采用file_get_contents("php://input")来获取
看了源码,设置Backbone.emulateJSON=true可更改contentType。但是我设置过依然没变。
 
问题:fetch可以传递参数吗?
当然可以。在fetch的options参数中设置data属性,传入jsonString参数。还可以通过type设置ajax的类型。默认是get。
 
    if (Backbone.emulateJSON) {  
          params.contentType = 'application/x-www-form-urlencoded';  
          params.data = params.data ? {model: params.data} : {};  
        }  
 
html代码
 
    <!DOCTYPE html>  
    <html>  
        <head>  
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
            <script src="lib/jquery-1.7.2.min.js" type="text/javascript"></script>  
            <script src="lib/underscore-min.js" type="text/javascript"></script>  
            <script src="lib/backbone-min.js" type="text/javascript"></script>  
        </head>  
        <body>  
              
        </body>  
          
        <script>  
            (function ($){  
                //model 默认name  
                Man = Backbone.Model.extend({  
                    //构造函数  
                    initialize :function(){  
                        //alert("you create me");  
                        //监听属性更改事件  
                        this.bind("change:name",function(){  
                            var name = this.get("name");  
                            alert("you change name to " + name);  
                        })  
                        this.bind("error",function(model,error){  
                            //alert(error);  
                        })  
                    },  
                    url:"save.php",  
                    //Backbone 每次向服务器读取或保存模型时都要调用执行的函数 默认是jquery.ajax方式。  
                      
                    // sync:function(method, model) {  
                        // //method会更具save的不同而改变,create,update,delete,read  
                      // alert(method + ": " + JSON.stringify(model));  
                      // model.id = 1;  
                    // },  
      
                    //默认属性  
                    defaults:{  
                        name:'david',  
                        age:30  
                    },  
                    aboutMe:function(){  
                        return "my name is " + this.get("name") + "今年" + this.get("age") + "岁";  
                    },  
                    validate:function(attributes){  
                        if(attributes.name == "fuck"){  
                            return "name is error!";  
                        }  
                    }  
                });  
                  
                var man = new Man;  
                //实例更改属性  
                man.set({name:"andy"});  
                //save会执行Backbone.sync 若model定义了sync则不会执行服务器请求  
                man.save({success:function(model,response){  
                    console.log(response);  
                }},{error:function(err){  
                    console.log("err");  
                }});  
      
                // man.save({name: "luky"});  
                  
                //从php服务器端获取返回数据 若model定义了sync则不会执行服务器请求  
                //从php服务器端获取返回数据  
                var man1 = new Man();  
                man1.fetch({  
                    url:"fetch.php",  
                    type:"POST",  
                    data:"name=John&location=Boston",  
                    success:function(model,response){  
                        alert(response.name);  
                    },  
                    error:function(err){  
                        console.log("err");  
                    }  
                });  
      
      
            })(jQuery);  
        </script>  
    </html>  
 
 
 
save.php
 
    <?php  
        header('Content-Type: application/json; charset=utf-8');    
        //不能通过$_POST获取。因为$_POST['paramName'] 只能接收Content-Type: application/x-www-form-urlencoded提交的数据  
        $man = json_decode(file_get_contents("php://input"));  
        file_put_contents("data.txt", $man->name);  
        echo true;    
    ?>  
 
 
 
fetch.php
 
    <?php  
        header('Content-Type: application/json; charset=utf-8');    
        file_put_contents("data.txt", $_POST["name"]);  
        die(json_encode(array('name'=>'tom')));    
    ?>