我已经定义了一个模型使用主干:

window.ResourceModel = Backbone.Model.extend({

        default:{
            'relativeurl':'unknow',
            'type': "unkonw"
        },

        initialize: function(){

            this.bind("change:relativeurl", function () {
                console.log('change!',this.relativeurl);
            });

            this.bind("change:type", function () {

            });
        },

        setRelativeURL: function (url) {
             console.log('pass in',url);//this have value
             this.set({"relativeurl": url});//this's value is undefined!
        },

        delResource: function () {
            console.log("this.url",this.relativeurl);
            resourceMasterView.delResourceItem(this.url);
        }
    });


然后我想调用此方法

window.resourceModel = new ResourceModel();
resourceModel.setRelativeURL(url);
resourceModel.setType(type);


但是我只是在上面发表评论,即使我已经调用了set方法,“ relativeurl”结果仍未定义!

我的代码有什么问题我该如何解决这个问题?

最佳答案

要访问Backbone模型的relativeurl属性,请说m.get('relativeurl')。该属性未存储为模型的属性,因此:

console.log('change!', this.relativeurl);


将始终为undefined生成this.relativeurl。你应该说:

console.log('change!', this.get('relativeurl'));


演示:http://jsfiddle.net/ambiguous/VBQ5h/

您也可以直接通过this.attributes访问该属性,但是通常应该不理会attributes

console.log('change!', this.attributes.relativeurl);


演示:http://jsfiddle.net/ambiguous/y3Q6b/

您的真正问题可能是对象属性和Backbone属性之间的混淆。属性是对象的字段,可以通过o.some_propertyo['some_property']进行访问。骨干模型主要处理存储在模型的attributes属性中的属性,这些属性可通过get访问并通过set(当然还有fetchunsetclear进行修改)。骨干模型对任意对象属性一无所知。

07-26 03:49