1

クライアントのリストを管理するコントローラーがあります。各クライアントは DS.Model です。コードは、コントローラーのコンテンツを App.Client.find() の結果、つまり RecordArray に設定した瞬間に、次の例外をスローします。コントローラーのコンテンツを空の配列 [] に設定した場合、またはクライアント オブジェクトに DS.Model の代わりに Ember.Object を使用した場合、例外は発生しません。

Uncaught Error: Cannot perform operations on a Metamorph that is not in the DOM. 

APP.ClientsController = Ember.ArrayController.extend({});

APP.Client = DS.Model.extend({
number:DS.attr('number'),
firstname:DS.attr('string')})


APP.ClientsRoute = Ember.Route.extend({
setupControllers: function(controller) {
    controller.set('clients',APP.Client.find());            
});

APP.store = DS.Store.create({
revision: 11,
adapter: 'DS.FixtureAdapter'     
});

ソースコードをデバッグしようとしましたが、Emberがコントローラーのコンテンツの変更を検出してarrayWillChangeイベントをトリガーすると、コードが失敗します

  arrayWillChange: function(content, start, removedCount) {
// If the contents were empty before and this template collection has an
// empty view remove it now.
var emptyView = get(this, 'emptyView');
if (emptyView && emptyView instanceof Ember.View) {
  emptyView.removeFromParent();
}

// Loop through child views that correspond with the removed items.
// Note that we loop from the end of the array to the beginning because
// we are mutating it as we go.
var childViews = get(this, 'childViews'), childView, idx, len;

len = get(childViews, 'length');

var removingAll = removedCount === len;

if (removingAll) {
  this.currentState.empty(this);
}

for (idx = start + removedCount - 1; idx >= start; idx--) {
  childView = childViews[idx];
  if (removingAll) { childView.removedFromDOM = true; }
  childView.destroy();
}

}、

4

1 に答える 1

1

外部スクリプト (DatatTable Jquery Plugin) との干渉であることが判明し、ember が制御する同じ dom 構造を変更しようとしました。

于 2013-01-08T16:22:38.730 に答える