2

ここで本当に明らかな何かが欠けているような気がします。これが私のモデルです:

define([
    'underscore',
    'backbone'
], function(_, Backbone) {
    var spamTermsModel = Backbone.Model.extend({});

    return spamTermsModel;
});

モデルを使用するコレクションは次のとおりです。

define([
        'jquery',
        'underscore',
        'backbone',
        'models/spamTermsModel'
    ],
    function($, _, Backbone, spamTermsModel) {
        var spamTermsCollection = Backbone.Collection.extend({
            model: spamTermsModel,
            url: 'spam-terms',
            initialize: function(models, options) {
                //console.log(models);
                this.fetch({
                    success: function(data, options) {
                        //console.log(data);  // logs data correctly
                    }
                });
            }
        });

        return spamTermsCollection;
    }
 );

これが私がコレクションと呼んでいるビューです:

define([
    'jquery',
    'underscore',
    'backbone',
    'models/spamTermsModel',
    'collections/spamTermsCollection'
], function($, _, Backbone, spamTermsModel, spamTermsCollection) {
    var searchTermsView = Backbone.View.extend({
        initialize: function() {
            var stm = new spamTermsModel();
            console.log(stm);  // returns function()
            this.collection = new spamTermsCollection();
            console.log(this.collection.toJSON());  // returns empty collection
        },
        retrieveTemplate: function(model) {
            return _.template($('#spamTermsTemplate').html(), model);
        },
        createList: function() {
            var list = '';
            _.each(this.collection.toJSON(), function (obj) {
                list += obj.term + ', ';
                //console.log(obj);
            });
            //console.log(this.collection.toJSON());
            return list;
        },
        render: function() {
            list = this.createList();
            this.$el.html(this.retrieveTemplate(list));
            return this;
        }
    });

    return searchTermsView;


   });
});

そして最後に私のルート:

router.on('route:updateSpamTerms', function() {
    require(['views/spamTermsView'], function(st) {
          s = new st();
          $('#web-leads').html(s.render().el);
    });

});

console.log()function()なので、問題は私のモデルにあると思います。新しいモデルを記録する必要があるように感じます。新しいモデルを返そうとしましたが、モデルがコンストラクターではないというエラーが発生しました。ここで何が欠けていますか?

4

1 に答える 1

2

this.collection = new spamTermsCollection(); console.log(this.collection.toJSON()); // returns empty collection

これは、フェッチが非同期であり、正常にフェッチされる前にアクセスしようとしているためです。

コレクションのイベントにバインドして、resetコレクションビューをレンダリングできます。

this.collection.on('reset', this.render, this);

これは、フェッチが常に非同期である場合は機能するはずですが、何らかの理由で将来的に非同期である場合は、問題が発生する可能性があります。initialize次のことを確認するために、フェッチをから移動することを検討できます。

this.collection = new spamTermsCollection();
this.collection.on('reset', this.render, this);
this.collection.fetch();
于 2013-02-04T20:16:39.483 に答える