0

私はバックボーンを備えたSPAを初めて使用し、バックボーンとrequireJsを使用して小さなアプリを開発しようとしています。

私が直面した問題は、コレクションを渡すことによってビューを拡張できないことです。

さて、これはMenuView.jsという名前のビューです

define([
'Backbone'
], function (Backbone) {
var MenuView = Backbone.View.extend({
    tagName: 'ul',
    render: function () {
        _(this.collection).each(function (item) {
            this.$el.append(new MenuListView({ model: item }).render().el);
        }, this);
        return this;
    }
});
return new MenuView;
});

これは、エラーが表示されたrouter.jsです。

define([
    'Underscore',
    'Backbone',
    'views/menu/menuView',
    'views/createNew/createNew',
    'collections/menu/menuCollection',
], function (_, Backbone, MenuView, CreateNewView,Menucollection) {

var AppRouter = Backbone.Router.extend({
    routes: {
        'index': 'index',
        'action/:Create': 'Create'
    },
    index: function () {
        CreateNewView.clear();
        //-----------  HERE IS THE PROBLEM ------------
        $('#menu').html(MenuView({ collection: Menucollection.models }).render().el);
    },
    Create: function () {
        CreateNewView.render();
    }
});

var initialize = function () {
    var appRouter = new AppRouter();
    Backbone.history.start();
    appRouter.navigate('index', { trigger: true });
};

return {
    initialize: initialize
};
});

エラーメッセージは「オブジェクトは関数ではありません」です。MenuViewは関数ではないので、私はこれに同意しました。MenuView(MenuView.extend({collection:Menucollection.models}))を拡張しようとしましたが、エラーメッセージは「objet [object、object]にはメソッドextendがありません」でした。

私がこれをやろうとしている方法は、正しい方法とはかけ離れていると思います。

誰かがこれを行う方法を提案できますか?

ありがとう

4

2 に答える 2

1

@Matti Johnのソリューションは機能しますが、ベストプラクティスのIMHOというよりは回避策です。

現状では、ビューを要求するだけでビューを初期化できます。これは次のとおりです。

  1. 引数を絶対に受け入れないように制限します
  2. ヒットパフォーマンス
  3. インスタンスの構築時にプロパティの割り当てを中継する場合、単体テストを非常に困難にします。

モジュールは、そのビューのインスタンスではなく、「クラス」ビューを返す必要があります。

MenuView.jsでは、router.jsで必要な場合は、それに置き換えreturn new MenuViewintitalzieします。return MenuView;

于 2012-10-08T00:37:10.573 に答える
0

MenuView.jsは初期化されたMenuViewを返すので、次のようにすることができます。

MenuView.collection = Menucollection

モデルを選択していないことに注意してください。コードを読み取るのが混乱し、ビューのコレクションとしてBackboneコレクションがないため、ビューのコレクションの代わりにモデルを使用しない方がよいと思います。また、コレクション内に含まれているメソッドも失われます(フェッチ/更新など)。

これを行う場合は、ループを更新する必要があります(それぞれがコレクションのメソッドとして使用可能です)。

this.collection.each(function (item) {
            this.$el.append(new MenuListView({ model: item }).render().el);
        }, this);
于 2012-10-07T12:57:47.387 に答える