0

こんにちは、私はEmber アプリ キットdidInsertElementを使用しています。ルートを変更するたびに起動する必要があります (子ビュー - アウトレットでのビュー)。グローバル アプリ DOM 準備完了イベントのようなものが必要です。

マビレインの解決策を見つけましたが、うまくいきません。

これが私のものapp/views/application.jsです:

export default Ember.View.extend({
   didInsertElement : function(){
      this._super();
      Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
   },
   afterRenderEvent : function(){
     // implement this hook in your own subclasses and run your jQuery logic there
     console.log("FIREEEEE");
  }   
});

アプリを実行すると が起動しますが、ルートを変更すると (リンクをクリック)、アプリケーション ビューイベントdidInsertElementがトリガーされません。didInsertElement

アプリケーション ビューが変更されないことはわかっていますが、子ビューを変更するたびに起動するものが必要です。それとも、アーキテクチャを台無しにして、別の方法で行っていますか?

助けてくれてありがとう。

4

1 に答える 1

1

@petkopalkoさん、コメントでHolder.jsをプレースホルダー画像に使用したいと言ったことから、Holder.jsの仕組みのためにHolder.run()関数を実行する必要があると言ったように。できることは、Holder.run() を didInsertElementフックで必要とする各ビューに追加することですが、それはやりたいことではなく、面倒になる可能性があります。

上記のコードから、Ember App Kit (EAK) とリゾルバーを使用して、実際に何をしていると思いますか:

 export default Ember.View.extend({...

内部からapp/views/application.js実際に ApplicationView に関連付けられたビューをエクスポートしているため、アプリケーション ビューはページの読み込み時に挿入されるため、一度だけ実行されます。

didInsertElement私は少しハッキングをしていましたが、うまくいくように見えるのは、Embers ビュークラス (オブジェクト) を再度開いて、フックに holder.run を追加する必要があることです。Ember基本クラスを再度開くことでEAK内から私から最もうまくいくように思われるのは、app.jsファイルでそれを行うことです。

app.jsファイルでは次のようになります。

 Ember.View.reopen({
   didInsertElement: function(){
     Ember.run.next(function(){
       Holder.run();
     }
   }
 });

そして、それはちょうど ember.run で動作するようです

 Ember.View.reopen({
   didInsertElement: function(){
     Ember.run(function(){
       Holder.run();
     }
   }
 });

そして、必要に応じて、コードを配置する前にすべてのコードを保持できますapp.js

Ember.View.reopen({
  didInsertElement : function(){
    this._super();
    Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
 },
 afterRenderEvent : function(){
   // implement this hook in your own subclasses and run your jQuery logic there
   console.log("FIREEEEE");

   //You can place the holder.run() function here and not in views

   Holder.run();
 }

});

再オープン ビューの afterRenderEvent 関数に Holder.run() を配置しない場合。必要と思われるビュー afterRenderEvent 関数に配置する必要があります。

 SomeView = Ember.View.extend({
   afterRenderEvent: function() {
     this._super();
     Holder.run();      
   }
 }); 

これらのアプローチの副作用についてはわかりませんが、実装後に調べることができます。したがって、ここにはいくつかのオプションがあります。ハッピーコーディング。

ここに添付されているのは、あなたが探していると思われる動作を説明しているように見える jsbin です。

http://emberjs.jsbin.com/medamata/6/edit

于 2014-03-11T03:14:22.887 に答える