4

別のビューから渡した既存のモデルのランク属性を更新したかったのです。ただし、エラーUncaught TypeError:Object#has nomethod'set'が表示されます。

ビューの初期化部分には、次のものがあります。

this.collection = new tgcollection({model : this.options.model });

属性値を更新することを目的とした関数updateModelを次のように定義します。

updateModel: function(){
    var val= $("#textbox_id").val();
console.log(val);   
console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);
this.options.model.set({"rank": val});
this.render();
//
},

どこが間違っているのですか?値と以前の属性値を持つモデルをコンソールで確認できます。

モデル:

define(['jquery','underscore', 'backbone', 'deepmodel'], 
       function($,_, Backbone) {
         var model = Backbone.DeepModel.extend({

        // Default attributes for the model.
        defaults : {
            id: null,
                rank: null,

        },

        initialize: function(){
            _.bindAll(this,"update");
                    this.bind('change : cost', this.update);
        },

        update: function(){
            console.log(this.get("cost"));

        },
        // Remove this model from *localStorage*.
        clear : function() {
            this.destroy();
        },

    });
    return model;

});

4

2 に答える 2

11

ただやる

this.model.set({"rank": val});

それ以外の

this.options.model.set({"rank": val});

ビュー内のモデルには、this.options.modelではなくthis.modelを介してアクセスします

于 2012-08-22T19:14:43.180 に答える
0

私は良い謎が大好きです。これが私が見たものに基づいた私の最良の推測です。問題はおそらくさらに遡ります。あなたが呼ぶ場所:

this.collection = new tgcollection({model : this.options.model });

this.options.modelおそらくあなたが思っていることではありません。this.options.modelをインスタンス化して渡すこのビューの前に、ビューを確認すると便利です。ところで、モデルとコレクションがビューに渡されると、いつでもモデル、コレクションに短縮できます。this.model他のいくつかは、渡されるとビューに直接アタッチされるという点で特別です。

私はあなたupdateModel()の次のSEEMで動作すると仮定しています:

console.log(JSON.stringify(this.options.model));
JSON.stringify(this.options.model);

上記の行ではなく、にエラーが発生していset()ます。したがって、モデルを渡したことが前提となります。それともあなたは?私の大げさな推測では、this.options.model実際には、モデルのjsonオブジェクトにすぎません。これは、モデルを文字列化したときにコンソールでモデルを「見る」理由を説明している可能性がありますが、モデルを呼び出すとバック​​ボーンが抗議しますset()

JSON.stringifyの代わりにthis.options.modelをテストしてみてくださいconsole.log(this.options.model)。まあ、あなたは本当にテストする必要はありません。バックボーンがこのオブジェクトを見つけることができないという事実set()は、物語の兆候です。コンソールにバックボーンモデルの複雑さが見られない場合、それはモデルではありません。

また、特にモデルのテストとデバッグでは、model.toJSON()関数がモデルであり、期待する属性が表示されていることを簡単に確認するために関数を使用する傾向があります。

もっと手がかりがあれば教えてください。

于 2012-08-22T18:49:34.383 に答える