0

バックボーンを使用してクライアント側アプリを構築しています。ユーザーがイベントで.get_jokeをクリックするたびにジョークを表示しようとしています。これが私のバックボーンアプリのコードです。

JokeModel = Backbone.Model.extend({
   url: '/jokes'
   initialize: function() {
      this.fetch();
  }
});

JokeView = Backbone.View.extend({
    template: _.template("<p><%= joke %></p>")
    events: {
      "click .get_joke" : "render"
  } 
    render: function() {
       var newJoke = new JokeModel;
       $(this.el).html(this.template(newJoke.toJSON()));
  }
});

newJokeView = new JokeView;

.get_jokeをクリックすると、ジョークがビューにレンダリングされないという問題があります。console.logで確認したため、モデルがフェッチされたことがわかりますが、ジョークが定義されていないと表示されますが、どこにあるのかわかりません。問題はです。ありがとう

4

2 に答える 2

3

まず第一に、あなたはconsole.log複雑なオブジェクトについて何を言っているかを信頼することはできません:

何が起こっているのかというと、joke.fetch()は非同期であり、呼び出しjokeView.render()たときにモデルはまだ準備ができていません。

アーキテクチャを少し変更し、各ジョークに適切なビューを割り当てる必要があります。これにより、各ジョークに対して、必要なときに表示を処理するビューを作成できます。

// code simplified an not tested
JokeModel = Backbone.Model.extend({
   url: '/jokes'
});

// This View is new and it is taking care only for the common event "click .get_joke"
// which is not related with any Joke in particular
// This View should be in charge of the JokesCollection 
// but I don't want to make things more complicate
JokeControls = Backbone.View.extend({
  events: {
    "click .get_joke" : "render"
  }, 

  getJoke: function(){
    var joke = new JokeModel();
    var view = new JokeView({ model: joke, el: this.$el.find( ".joke-wrapper" ) });
    joke.fetch();
  },
});


// This is the View that is related with unique Joke
JokeView = Backbone.View.extend({
    template: _.template("<p><%= joke %></p>"),

    initialize: function(){
      // see how it shows itself when the Model is ready
      this.model.on( "change", this.render, this );
    },

    render: function() {
       this.$el.html(this.template(this.model.toJSON()));
    }
});

// Activate the Joke Controls
newJokeControls = new JokeControls({ el: "#joke-controls" });
于 2012-09-06T12:09:30.597 に答える
0

次のことを試してください。

JokeModel = Backbone.Model.extend({
   url: '/jokes'
   parse : function(data) {
      console.log(data);
      return data;
   }
   initialize: function() {
      this.fetch();
  }
});

次の場合もログアウトします。

newJoke.toJSON()

実際にレンダリングしようとしているものを確認します。

于 2012-09-06T11:53:05.263 に答える