2017-02-20 1 views
0

私のアプリケーションにルートと対応するテンプレートがあります。ページの読み込み自体で、URLパラメータに基づいて要素を隠すことはしません。私はjQuery $.("elementName").hide();とそれ以外の組み合わせを使用してafterModelメソッドでこれを実行しようとしました。しかし、DOMはまだ利用できないと思われるので、何も機能しません。アクションセクションのボタンアクションと同じことが達成できますが、ページロード時にそれをやってみたいと思っています。誰かが私が間違っていることを指摘できますか?emberJSのHTML要素の属性をafterModelまたは類似のメソッドから変更する方法

+0

おそらく 'didInsertElement'を使用できます。しかしそれはEmberのようなものではありません。代わりに、デフォルトで要素を非表示にして、必要に応じて要素をオンにしてみてください。 –

+0

@ torazaburoそれは私がやったことであり、それは働いた。私はフックdidTransitionと 'アフターレンダリング'を使用しなければなりませんでした。しかし、理想的な方法は、以下に述べるようにヘルパーを使うことです。私は朝にそれを試してみて、効果があるかどうかを教えてくれるでしょう。 – Rahul

+0

あなたはあなたのルートの中で "didTransition"イベントを使うことができると思います –

答えて

0

これを行うための正しい方法は、燃えさしを使用することです

q: '', 
colors: [], 
hasSearch: Ember.computed.notEmpty('q'), 
hasColors: Ember.computed.notEmpty('colors') 

テンプレート/ index.hbsハンドルバー{{#if}}ヘルパー。あなたはqueryParamsそのかなり簡単と組み合わせる場合:

をお使いのコントローラは次のようになります。

export default Ember.Controller.extend({ 
    queryParams: ['showSomething'], 
}); 

そして、このようなあなたのテンプレート:

<h1>Hello</h1> 
{{#if showSomething}} 
    <div id="something">something</div> 
{{/if}} 

あなたが本当にしたい場合に手動でDOMを操作するには、didInsertElementフックでこれを行うことができます。あなたが唯一のコンポーネントでこのを持っているしかし:

のでmy-component.hbsは次のようになります。

<div id="{{concat elementId "something"}}>something</div> 

とあなたのmy-component.js

export default Ember.Component.extend({ 
    didInsertElement() { 
    this._super(); 
    if(false) { 
     $(`#${this.get('elementId')}something`).hide(); 
    } 
    } 
}); 

をしかし、私は強く反対をお勧めします!

+0

this._super()の目的は何ですか?なぜこのアプローチに対してお勧めしますか? didTransitionとafterRenderを使用して、ルート自体でこれを解決しました。私は以下のリンクを参照しました:https://discuss.emberjs.com/t/is-there-an-event-after-the-template-has-been-added-to-the-outlet/8737。もう1つのことは、今のところ私のアプリにコントローラがないということです。私はそれを追加することができると思うが、それが必要かどうか分からない。私は明日あなたのアプローチを試すのを待っている。 – Rahul

+0

チェックアウト[このリンク](https://guides.emberjs.com/v2.11.0/object-model/classes-and-instances/#toc_overriding-parent-class-methods) 「これ。_super() 'は上書きされたメソッドを呼び出しています。そして私は最初のアプローチを推奨しています。なぜなら、それを行うための唯一の邪悪な方法だからです。これを手動で行う場合、基本的にフレームワークに対して作業します。また、ルートでこれを行うことは、私が考えている動作はサポートされていません.Emberはいつでもコンポーネントを再レンダリングすることができます。また、ハンドルバーを使用すると、実際にノードがDOMから削除されるため、パフォーマンスが向上します。なぜこの方法を使わないのでしょうか? – Lux

0

URLパラメータqueryParamsはルートにありますか?そうであれば、コントローラのプロパティを設定して、それらの存在(または他の真実の条件)をチェックし、DOM表示のためにテンプレート内のプロパティを利用することができます。これらの値を子コンポーネントに送ることさえできます。

ルート/ index.js

queryParams: { 
    q: { 
    refreshModel: true 
    }, 
    colors: { 
    refreshModel: true 
    } 
} 

コントローラ/ index.js

{{#if hasSearch}} 
    <p>You are searching for {{q}}</p> 
{{/if}} 
// .. etc for colors 
関連する問題