Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RESTful api存在Backbone.js model.save()问题_Backbone.js - Fatal编程技术网

RESTful api存在Backbone.js model.save()问题

RESTful api存在Backbone.js model.save()问题,backbone.js,Backbone.js,我有一个使用api保存到数据库的模型。我的问题是更新此模型时。第一次更改任何内容并调用model.save时,属性将作为JSON传递给api,api将解析并保存它,而不会出现任何问题。现在,我第二次在同一视图中对该模型进行更改时,model.save将一个未定义的对象添加到我的模型中。api看到此对象并拒绝PUT请求 为什么它与第一次更新一起工作,而与第二次更新不一起工作 谢谢你的帮助 这是代码,希望你能理解 var LDAccount = Backbone.Model.extend({

我有一个使用api保存到数据库的模型。我的问题是更新此模型时。第一次更改任何内容并调用model.save时,属性将作为JSON传递给api,api将解析并保存它,而不会出现任何问题。现在,我第二次在同一视图中对该模型进行更改时,model.save将一个未定义的对象添加到我的模型中。api看到此对象并拒绝PUT请求

为什么它与第一次更新一起工作,而与第二次更新不一起工作

谢谢你的帮助

这是代码,希望你能理解

var LDAccount = Backbone.Model.extend({
    defaults : {
        ACC_NUM : '',
        BOOK_DATE : '',
        F_NAME : ''
    },
    template : _.template(
        "<p>Full Name</p><input data-id='F_NAME' type=text value='<%= F_NAME %>' />" +
        "<p>Book Date</p><input data-id='BOOK_DATE' type=text value='<%= BOOK_DATE %>' />"
    ),
    urlRoot : 'api/account'
});

var LDAccountView = Backbone.View.extend({
    el : '', // set this when instantiating this model in the router
    initialize : function(options) {
        this.model = options.model;
        this.model.id = options.id;
        this.model.bind('change', this.render, this);
        this.model.bind('error', this.renderError, this);
    },
    render : function() {
        $(this.el).html(this.model.template(this.model.toJSON()));
        $(this.el).append(
            '<div id="model_buttons" >' +
            '<input type=button id=reset value=Reset />' +
            '<input type=button id=save value=Save />' +
            '</div>'
        );
        return this;
    },
    events : {
        'click #save' : 'save2db'
    },
    save2db : function() {
        var $fields = $(this.el).find('input[type=text]');
        var modObj = new Object();
        $fields.each(function() {
            var $field = $(this);
            var prop = $field.attr('data-id');
            var val = $field.val();
            modObj[prop] = val;
        });
        this.model.set(modObj);
        console.log(modObj);
        this.model.save({
            success : function() {
                self.reset();
            }
        });
        return false;
    },
    renderError : function() {
        $(this.el).append('<p class=error>Account does not exist</p>');
    },
    reset : function() {
    }
});

var MainView = Backbone.View.extend({
    // code omitted since it's not relevant to the question
});

var LDRouter = Backbone.Router.extend({
    routes : {
        "account/:modl/:acc_num": "renderView" 
    },

    initialize : function() {
        this.search = new MainView({ el : '#main'});
    },

    // THIS IS THE VIEW THAT RENDERS THE MODEL
    renderView : function(modl, acc_num) {
        var self = this;
        var model = null;

        switch(modl) {
            case 'account':
                model = new LDAccount();
                break;
            // these other models were omitted for clarity
            case 'asset':
                model = new LDAsset();
                break;
            case 'info':
                model = new LDInfo();
                break;
            default:
                model = new LDAccount();
                break;
        }

        this.account = new LDAccountView({ id : acc_num, el : '#accDetail', model : model });
        this.account.reset = function() {
            self.renderView(modl,acc_num);
        };
        this.account.model.fetch();
    },

    accountInfo : function (acc_num) {
        var root = '';
        var url = window.location.href;
        var hashPos = url.indexOf('#');
        if(hashPos != -1) {
            root = url.substr(0,hashPos);
        } else {
            root = url;
        }
        window.location = root + "#account/account/" + acc_num;
    }

});

$(function() {
    var app = new LDRouter();
    Backbone.history.start();
});
var LDAccount=Backbone.Model.extend({
默认值:{
ACC_NUM:“”,
登记日期:'',
F_名称:“”
},
模板:\ u0.template(
“全名

”+ “图书日期

” ), urlRoot:“api/帐户” }); var LDAccountView=Backbone.View.extend({ el:“”,//在路由器中实例化此模型时设置此选项 初始化:函数(选项){ this.model=options.model; this.model.id=options.id; this.model.bind('change',this.render,this); this.model.bind('error',this.renderError,this); }, render:function(){ $(this.el).html(this.model.template(this.model.toJSON()); $(this.el)( '' + '' + '' + '' ); 归还这个; }, 活动:{ “单击#保存”:“保存2db” }, save2db:function(){ var$fields=$(this.el).find('input[type=text]'); var modObj=新对象(); $fields.each(函数(){ var$字段=$(此字段); var prop=$field.attr('data-id'); var val=$field.val(); modObj[prop]=val; }); 这个.model.set(modObj); 控制台日志(modObj); 这个是.model.save({ 成功:函数(){ self.reset(); } }); 返回false; }, renderError:函数(){ $(this.el).append(“

帐户不存在”

”; }, 重置:函数(){ } }); var MainView=Backbone.View.extend({ //代码被省略,因为它与问题无关 }); var LDRouter=Backbone.Router.extend({ 路线:{ “帐户/:modl/:acc_num”:“renderView” }, 初始化:函数(){ this.search=newmainview({el:'#main'}); }, //这是渲染模型的视图 renderView:功能(modl,acc_num){ var self=这个; var模型=null; 开关(modl){ “账户”案例: 模型=新的LDAccount(); 打破 //为了清楚起见,省略了这些其他模型 案例“资产”: 模型=新的LDAsset(); 打破 案例“信息”: 模型=新的LDInfo(); 打破 违约: 模型=新的LDAccount(); 打破 } this.account=new LDAccountView({id:acc_num,el:'#accdeal',model:model}); this.account.reset=函数(){ 自渲染视图(modl,acc_num); }; this.account.model.fetch(); }, accountInfo:函数(acc_num){ var根=“”; var url=window.location.href; var hashPos=url.indexOf('#'); 如果(hashPos!=-1){ root=url.substr(0,hashPos); }否则{ root=url; } window.location=root+“#帐户/帐户/”+acc_num; } }); $(函数(){ var app=新的LDRouter(); Backbone.history.start(); });
嗯, 将所有参数传递给model.save似乎有效。 在其他世界

this.model.save(
    {
        success: function() {
            // do some stuff here
        },
        error: function() {
            // do other stuff here
        }
    }
);
解决了我遇到的问题。 我仍然想知道为什么save要传递一个添加到模型属性中的未定义对象。

嗯, 将所有参数传递给model.save似乎有效。 在其他世界

this.model.save(
    {
        success: function() {
            // do some stuff here
        },
        error: function() {
            // do other stuff here
        }
    }
);
解决了我遇到的问题。
我仍然想知道为什么save要传递一个添加到模型属性中的未定义对象。

这是因为您忘记初始化变量,该变量存储POST数据部分,例如“”。因此,当数据作为字符串附加到变量时,它会附加到“undefined”后面。解决方案:问题出在您的服务器上

这是因为您忘记初始化变量,该变量存储POST数据部分,例如使用“”。因此,当数据作为字符串附加到变量时,它会附加到“undefined”后面。解决方案:问题出在您的服务器上

添加一些示例代码以提供有关您正在执行的操作的其他信息确实会有帮助。请添加模型的代码以及如何保存它。添加一些示例代码以提供有关您正在执行的操作的其他信息确实会有帮助。请添加模型的代码以及如何保存它。仍然不知道这是否会像api所说的那样起作用,第一个参数是要在模型上更改的属性的散列,第二个参数是回调。所以
.save({},{success:function})
应该按照您的期望执行。安德烈亚斯是对的。第一个参数可以替换
this.model.set('someProperty','someValue')
code。如果您已经设置了模型属性(如OP所做的),您可以简单地传入一个空对象,正如Andreas在上面所指出的。仍然不知道这是否会像api所说的那样起作用,第一个参数是您想要在模型上更改的属性的散列,第二个参数是回调。所以
.save({},{success:function})
应该按照您的期望执行。安德烈亚斯是对的。第一个参数可以替换
this.model.set('someProperty','someValue')
code。如果您已经设置了模型属性(如OP所做的),您可以简单地传入一个空对象,正如Andreas上面所指出的。