2017-02-20 7 views
0

엠버 응용 프로그램에 경로 및 해당 템플릿이 있습니다. 페이지를로드 할 때 URL 매개 변수를 기반으로 몇 가지 요소를 숨기려고합니다. jquery $.("elementName").hide(); 및 그 외 몇 가지 조합을 사용하여 afterModel 메서드에서이 작업을 시도했습니다. DOM은 아직 사용할 수 없기 때문에 아무 것도 작동하지 않습니다. 액션 섹션의 버튼 액션으로도 동일하게 수행 할 수 있지만, 페이지로드시 수행하는 것처럼 도움이되지 않습니다. 누군가 내가 잘못하고있는 것을 지적 할 수 있습니까?emberJS에서 HTML 요소의 속성을 afterModel 또는 유사한 방법으로 변경하는 방법

+0

아마도'didInsertElement'를 사용할 수 있습니다. 하지만 그건 엠버 같은 것이 아닙니다. 대신, 기본적으로 요소를 숨기고 필요에 따라 요소를 켜는 것이 어떻습니까? –

+0

@ 토라자부로는 내가했던 것과 그것이 효과가있다. 후크 didTransition과 'After-render'를 사용해야했습니다. 그러나 이상적인 방법은 아래에서 언급 한 것처럼 도우미를 사용하는 것이고, 나는 아침에 그것을 시험해보고 효과가 있는지 알려 줄 것입니다. – 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. 한 가지 더는 지금 내 앱에 컨트롤러가 없다는 것입니다. 나는 그것을 추가 할 수 있었다고 생각하지만 그것이 필요한지 확실하지 않다. 나는 내일 당신의 접근 방식을 시험해보기를 기다리고있다. – Rahul

+0

Checkout [이 링크] (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