0

新しいドキュメントを作成し、既存のドキュメントのコピーを作成するルートがあります。

App.DocumentsNewRoute = Ember.Route.extend({
  model: function (params) {
    this.modelParams = params; // save params for reference
    return App.Document.createRecord();
  },
  setupController: function (controller, model) {
    // use the params to get our reference document
    var documentModel = App.Document.find(this.modelParams.document_id);

    documentModel.one('didLoad', function () {
      // once loaded, make a serialized copy
      var documentObj = documentModel.serialize();

      // and set the properties to our empty record
      model.setProperties(documentObj);

      console.log('didLoad');
    });
  }
});

ビューにいくつかのログを追加しました。

App.DocumentView = Ember.View.extend({
  init: function () {
    this._super();
    // fires before the didLoad in the router
    console.log('init view');
  },
  willInsertElement: function () {
    // fires before the didLoad in the router
    console.log('insert elem');
  }
});

そして、これが私のテンプレートです

{{#if model.isLoaded }}
  {{ view App.DocumentView templateNameBinding="model.slug" class="document portrait" }}
{{ else }}
  Loading...
{{/if}}

問題は、私のモデルisLoadedがレンダリングされたときにデータが入力されていないため、この時点では templateNameBinding が存在せず、データが入力されたときに更新されないように見えることです。

テンプレートで model.isLoaded 以外のものを使用する必要がありますか、それともテンプレートの再レンダリングを強制する必要がありますか? もしそうなら、どのように、どこで? ありがとう!

4

1 に答える 1

0

あなたは物事を過度に複雑にしているようです。そのはず:

編集

私はあなたの質問を最初に読んだときに誤解したので、

App.DocumentsNewRoute = Ember.Route.extend({
    model: function (params) {
        var originalDoc = App.Document.find(params.document_id),
        newDoc = App.Document.createRecord();
        originalDoc.one('didLoad', function () {
             newDoc.setProperties(this.serialize());
        });
        return newDoc;
    },
    setupController: function (controller, model) {
        controller.set('content', model);
    }
});

すべてが正しければ、ember は自動的に再レン​​ダリングします。

于 2013-02-11T12:03:40.013 に答える