1

ユーザーデータを2回出力するこの問題があります。これはコードです:

window.UserData = {}
UserData.Model = Backbone.Model.extend();
UserData.Collection = Backbone.Collection.extend({
  url: '/test.php?c=userData',
  model: UserData.Model,
  parse: function (response) {
    return response.data;
  }
});
UserData.View = Backbone.Marionette.CompositeView.extend({
  tagName: 'span',
  template: Handlebars.compile($('#user-data-template').html())
});
BaseApp.Layout = Backbone.Marionette.Layout.extend({
  template: Handlebars.compile($('#base-layout-template').html()),
  regions: {
    'region_user_data': '#user_data_reg'
  },
  initialize: function () {
    _.bindAll(this);
  },
  onRender: function () {
    var self = this;
    var c = new UserData.Collection();
    c.fetch({
      success: function () {
        var ud = new UserData.View({
          collection: c
        });
        self.region_user_data.show(ud);
      }
    });
  }
});

この BaseApp レイアウトは、領域 (本体内) で 1 回レンダリングされます。

これはテンプレートです:

<script id='user-data-template' type='text/x-handlebars-template'>
    <a href="#" id="logout"> Logout </a> Hola {{uname}}
</script>

<script id='base-layout-template' type='text/x-handlebars-template'>
    base page layout
    <div id="user_data_reg" class="user_data_reg"></div>
</script>

これはブラウザ(クロム)に表示されているものです:

Logout Hola Logout Hola 14

ご覧のとおり、ユーザー レイアウトが 2 回表示されますが、最初は uname が表示されません。これは、Chrome では次のようになっているため、ちょっと奇妙です。

child {models: Array[0], length: 0, _byId: Object, 
constructor: function, url: "http://localhost/test.php?c=userData"…}

モデルは1つだけ表示されており、コンテンツを2回印刷しています。

また、コレクション データを取得するときは、次のようにします。

c.fetch({
  success: function () {
    var ud = new UserData.View({
      collection: c
    });
    self.region_user_data.show(ud);
    console.log("print xx");
  }

そして、「print xx」をログに記録するのは1回だけで、予想どおり2回ではありません。

コレクションが 1 つのモデルのみをフェッチしているのに、2 つの userData コンテンツを取得するのはなぜですか? よろしく。

4

1 に答える 1

0

これはビュー タイプの問題でした。「CompositeView」を使用する代わりに、ItemView に切り替えたところ、問題は解消されました。マリオネットは単一のデータに ItemView を強制的に使用していると思います。

于 2013-04-25T18:08:13.363 に答える