4

ルートにsetupControllerandmodelフックがあります。model.find(param) は、Rails バックエンドへの ajax 呼び出しを保持します。

何が起こるかというと、モデル フックが起動し、バックエンドが呼び出されます。しかし、バックエンドが応答し、成功のコールバックが実際にモデルとともに返される前に、setupControllerまだ定義されていないモデルでフックが起動します。

最終結果は、モデル自体がバインディング システムを介して更新されている間、setupController で行う必要がある追加のセットアップが機能していないということです。どうもモデルの内容を間違っているような気がするのですが、よくわかりません。

ちなみに、これは、戻るボタンと進むボタンを使用してナビゲートした場合にのみ発生します。#linkTo指定されたオブジェクトを使用してルートを進むと、すべてが期待どおりに機能します。

誰かが素晴らしいアイデアを持っている場合、私が持っているコードは以下のとおりです。

App.ProjectsEditRoute = Ember.Route.extend({
  model: function(params) {
    return App.Project.find(params.project_id);
  },

  setupController: function(controller, model) {
    this.controllerFor('activedataset.index').set('content', App.ActiveDataSet.findAll(model.id));
  }
});

App.Project = Ember.Object.extend({
  id: '',
  name: ''
});

App.Project.reopenClass({
  findAll: function() {
    var result = Ember.ArrayProxy.create({content: []});
    var self = this;
    $.ajax({
      url: '/projects.json',
      type: 'GET',
      data: {'user_id': App.currentUser.id},
      success: function(data, textStatus, xhr) {
        result.set('content', data.projects);
      },
      error: function(xhr, textStatus, errorThrown) {
        alert('error');
      }
    });

    return result;
  },

  find: function(project_id) {
    var result = Ember.Object.create({content: null});
    var self = this;
    $.ajax({
      url: '/projects/' + project_id + '.json',
      type: 'GET',
      success: function(data, textStatus, xhr) {
        result.setProperties(data.project);
      },
      error: function(xhr, textStatus, errorThrown) {
        alert('not found');
      }
    });

    return result;
  }
});

Mike が提供するソリューションの後に編集します。

App.ProjectsEditRoute = Ember.Route.extend({
  model: function(params) {
    var record = App.Project.find(params.project_id);
    var promise = Ember.Deferred.create();
    record.addObserver('isLoaded', function() {
      promise.resolve(record);
    });

    return promise;
  },

  setupController: function(controller, model) {
    this.controllerFor('activedataset.index').set('content', App.ActiveDataSet.findAll(model.id));
  }
});

App.Project.reopenClass({
  find: function(project_id) {
    var result = Ember.Object.create({content: null, isLoaded: false});
    var self = this;
    $.ajax({
      url: '/projects/' + project_id + '.json',
      type: 'GET',
      success: function(data, textStatus, xhr) {
        result.setProperties(data.project);
        result.set('isLoaded', true);
      },
      error: function(xhr, textStatus, errorThrown) {
        alert('not found');
      }
    });

    return result;
  }
});
4

2 に答える 2

4

どうもモデルの内容を間違っているような気がするのですが、よくわかりません。

あなたのしていること自体は間違っていません。setupController フックに移る前に、モデル ajax が完了するのを待つために ember ルーターが必要な場合は、モデルの find() が promise を返す必要があります。ルートのモデル フックが promise を返す場合、ember ルーターは次に進む前に promise が解決されるのを待ちます。

デフォルトでは、find({}) を呼び出すと、ember-data のモデル オブジェクトは promise を返します。モデルで同じことを行うのは簡単なはずです。遅延パターンの例については、クエリを使用してルート モデルを初期化するこの Emberを参照してください。

ちなみに、これは、戻るボタンと進むボタンを使用してナビゲートした場合にのみ発生します。指定されたオブジェクトを使用して #linkTo を介してルートに進むと、すべてが期待どおりに機能します。

理にかなっています。#linkTo を使用すると、データはすでに読み込まれています。

于 2013-03-19T19:45:15.693 に答える