簡體   English   中英

在骨干模型上沒有方法“獲取”

[英]No method 'get' on backbone model save

我正在使用骨干的合理形式。 我有許多嵌套模型,並且一直在計算父模型中的其他變量,如下所示:

// INSIDE PARENT MODEL

computedValue: function () {
    var value = this.get('childModel').get('childModelProperty');
    return value;
}

這似乎可以使我的UI保持同步,但是在我致電后

.save()

在父模型上,我得到:

Uncaught TypeError: Object #<Object> has no method 'get' 

子模型似乎暫時停止響應。

我在做某些天生的錯誤嗎?

編輯:堆棧跟蹤是:

Uncaught TypeError: Object #<Object> has no method 'get' publish.js:90
Backbone.Model.extend.neutralDivisionComputer publish.js:90
Backbone.Model.extend.setNeutralComputed publish.js:39
Backbone.Events.trigger backbone.js:163
_.extend.change backbone.js:473
_.extend.set backbone.js:314
_.extend.save.options.success backbone.js:385
f.Callbacks.o jquery.min.js:2
f.Callbacks.p.fireWith jquery.min.js:2
w jquery.min.js:4
f.support.ajax.f.ajaxTransport.send.d

編輯#2以回應以下評論:

我仍然沒有得到一些基本知識。 我替換了對this.get('childModel')['childModelProperty']的一些引用,現在我得到了諸如“無法讀取未定義的屬性childModelProperty”之類的信息。

我尚未從服務器中提取任何東西,父模型只是像

define(['jquery', 'underscore', 'backbone', 'models/childmodel'],    function($, _, Backbone, ChildModel) {
var ParentModel = Backbone.Model.extend({
defaults: {
   childModel : new ChildModel()
    }

defaults僅在創建模型時使用。 調用save之后,它將調用set ,它將用一個簡單的javascript對象覆蓋childModel。 在我看來,您有兩種選擇:

1)使用Backbone.Relational

2)覆蓋每個父模型中的set ,以更新現有子模型(或創建它),如下所示:

children:{
    childModel: ChildModel
}
set: function (key, value, options) {
                var attrs;
                if (_.isObject(key) || key == null) {
                    attrs = key;
                    options = value;
                } else {
                    attrs = {};
                    attrs[key] = value;
                }

                _.each(this.children, function (childType, name) {
                    if (!attrs.hasOwnProperty(name))
                        return;

                    //assume the child is just a model--not a collection
                    var newValue = attrs[name];
                    delete attrs[name];
                    var isModel = this[name] && this[name].set;
                    if (isModel && newValue) {
                        this[name].set(newValue, options);
                    }
                    else if (newValue) {
                        this[name] = new childType(newValue);
                    }
                    else {
                        delete this[name];
                    }

                    this.trigger('change:' + name);

                }, this);

                return Backbone.Model.prototype.set.call(this, attrs, options);             

    }

有時,您的childModel不包含Backbone.Model,就像您被分配了其他類型的對象一樣。

為避免錯誤,請執行此操作(在控制台中,您還將獲得有關該錯誤childModel值的有用信息):

computedValue: function () {
    var value;
    if( this.get('childModel') instanceof Backbone.Model ){
        value = this.get('childModel').get('childModelProperty');
    }else{
        console.log('This is weird, childModel is not a Backbone.Model', this.get('childModel') );
    }
    return value;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM