2012-09-04 2 views
2

오랫동안 나는 render()이 부모보기의 관심사가 아닌보기의 특권임을 확신했습니다.백본보기에서 render() 메서드를 호출하는 좋은 방법

그러나 요즘에는 백본에 대해 delegateEvents에 대해 읽고 구현 방법에 대한 느낌이 엇갈 렸습니다. 지금까지 모든 곳에서 나는 initialize 메서드 내에서 render() 메서드를 호출하고있었습니다.

철저한 테스트를 수행하지 않았거나 문제가 발생할 수있는 사용 사례를 발견했습니다. 그러나 그것은 나에게 내가했던 방식으로 숨어있는 잠재적 인 문제의 느낌을 준다.

경험을 공유해주세요. initialize 내에 render() 메서드를 호출 할 때의 문제점은 무엇입니까? 그리고 어떻게 할 건데?

부모가 자신을 렌더링 할 위치와 시간을 지정합니다. r 여전히 SoC (경계 분리)의 경계 내에 있습니까?

답변

1

기본적 I는 상기 제 2 렌더링에 대한 3 가지 시나리오를 참조 상기 렌더 내에 부모 기본적 아이가 렌더링 될 때 부모는 어디에 또는 지시의 경우

// parent view's render 
render: function() { 
    var child = new ChildView({el: this.$('.foo'), model: bar, ...}); 
    this.$el.append(child.render().el); 
} 

및 render-within-itself,

이는 렌더링이 완료 될 때 하위 뷰가 지시하는 경우입니다. 내 의견은 후자가 더 좋다는 것이다. 뷰가 렌더링되어야하는 시점을 알 수 있도록 (뷰를 초기화하거나 모델/콜렉션을 가져온 직후에해야 함) 응용 프로그램을 배열해야합니다. 나는 delegateEvents이 호출 된 후에도 renderinitialize으로 호출 할 때 어떤 문제도 보지 못합니다. el을 채우는 것이 어떻게 작동하는지에 차이를 두어서는 안됩니다.

initialize 내에서 render을 호출하는 것은 상황에 관계없이 작동하고 렌더링 방식을 통일하기 때문에 (다른보기와 같은 방식으로 페치 한 후에 렌더링하는보기 추가) 좋은 연습입니다. 나는이 방법으로 렌더링을하는 데 어떤 문제도 겪지 않았으며, 분명히 당신도 그 중 하나가 아닙니다!

희망이 있으면 도움이됩니다 (또는 안심하시기 바랍니다).

+1

단위 테스트를 작성할 때 초기화 호출에서 렌더링 호출을하는 것은 큰 고통이 될 수 있습니다. 모든 테스트가 뷰를 구성하여 해당 뷰 중 하나에 대해 테스트합니다. 뷰가 렌더링 할 때마다 매번 렌더링을 조롱하거나 2) 렌더링이 아무 것도 부러지지 않도록 정렬하는 경우 . 두 경우 모두, 당신이 다루고 싶어하는 것이 아닙니다. –

1

"오랫동안 나는 render()가 뷰의 독점이며 상위 뷰는 관심이 없다고 확신했다."

당신은 올바른 길을 가고있었습니다. 사람들은 종종 render을 공용 메서드처럼 취급하지만보기 외부에서 렌더링을 호출하면 스파게티 코드와 혼란 만 생기게됩니다.

가장 좋은 방법은 초기화의 일부로 해당 모델의 적절한 이벤트에 응답하여 렌더링 (또는 렌더링 예약)하는 것입니다.

관련 문제