2

かなり複雑なフォームにバックボーンを使用しています。ネストされたモデルがいくつかあり、親モデルの他の変数を次のように計算しています。

// 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'] へのいくつかの参照を置き換えたところ、「undefined のプロパティ childModelProperty を読み取ることができません。

私はまだサーバーから何もプルしていません。親モデルは次のように作成されています

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

2 に答える 2

1

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);             

    }
于 2012-07-06T19:04:59.850 に答える
0

他の種類のオブジェクトが割り当てられたように、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;
}
于 2012-07-06T15:13:16.517 に答える