2012-11-05 4 views
2

지나치게 재사용 될 수 있기 때문에 일부 도우미 함수를 다른 파일에 배치하려고합니다. https://github.com/playframework/Play20/blob/master/samples/scala/computer-database/app/views/list.scala.htmlPlayFramework 2.0 - 다른 템플릿의 함수를 호출 할 수 없습니다.

내가 응용 프로그램/뷰 패키지에서 "listing.scala.html"라는 새로운 파일을 생성하고 원본 파일에서 @ 링크 기능을 이동 : 나는 컴퓨터, 데이타베이스 샘플의 목록 파일을했다 그것에. 이 하나,

@(currentSortBy: String, currentOrder: String, currentFilter: String) 

@**************************************** 
* Helper generating navigation links * 
****************************************@ 
@link(newPage:Int, newSortBy:String) = @{ 

    var sortBy = currentSortBy 
    var order = currentOrder 

    if(newSortBy != null) { 
     sortBy = newSortBy 
     if(currentSortBy == newSortBy) { 
      if(currentOrder == "asc") { 
       order = "desc" 
      } else { 
       order = "asc" 
      } 
     } else { 
      order = "asc" 
     } 
    } 

    // Generate the link 
    routes.Application.listPerfil(newPage, sortBy, order, currentFilter) 

} 

그래서, 내 원본 파일에, 나는 @link 호출을 대체 :이 새 파일은 다음과 같습니다

<a href="@listing(currentSortBy, currentOrder, currentFilter).link(0, key)">@title</a> 

그리고 내가 컴파일하려고 할 때 문제는, 이 오류를 얻을 :

value link is not a member of play.api.templates.Html 

그러나 설명서에 따라 (http://www.playframework.org/documentation/2.0.4/ScalaTemplateUseCases이)가 확인 될 것으로 보인다.

아무리 생각해도 되겠습니까?

답변

1

Play의 템플릿은 대부분의 아마 당신에게, 즉에만 필요 링크

를 반환합니다 일부 컨트롤러 (또는 다른 방법)에 처리함으로써 더 나은 유연성을 얻을 것이다, 고급 조건을 배치하기위한 가장 좋은 장소되지 않습니다 : 귀하의 경우에는

<a href="@controllers.Application.link(currentSortBy, currentOrder, currentFilter, 0, key)">@title</a> 

는 역방향 경로를 반환 할 수 Application 컨트롤러의 link(...) 기능을 제안했다.

다른 템플릿을 포함하는 것이 HTML 블록을 반복하는 데 가장 좋지만 때로는 지정된 문자열을 얻기가 어렵다는 점을 명심하십시오. 보시다시피 중첩 된 함수를 호출하는 데 문제가 있습니다. 대부분 에 전체 A 태그를 생성 할 수 있지만 사용하기에는 불편합니다 (IMHO).

+0

네, 요점을 봅니다. 이것은 뷰 관련 함수이므로 컨트롤러를 사용하지 않아 컨트롤러에 없어야합니다. 그리고이 문서는이 사용법을 장려합니다. 불행히도 그것은 작동하지 않습니다. 나는 link라고하는 하나의 HTML 파일을 만들어서 마지막 기회를 줄 것이라고 생각한다. 작동한다면 코드 중복을 피하기 위해 몇 가지 단일 기능 파일을 사용하여 전자 메일을 위험에 빠뜨릴 수 있습니다. –

+0

확실히 블록을 형성하는 것은 템플릿을위한 작업이지만 올바른 경로를 만드는 것은 로직의 일부로 간주 될 수 있습니다. 한번보세요 : 당신의 view에서 non-view 함수 인'routes.Application.listPerfil (newPage, sortBy, order, currentFilter)'를 사용하고 있습니다, 그래서 나는 당신 자신의 'wrapping'과 관련하여 잘못된 것을 보지 않습니다. 함수/메소드. 당연히 그것은 당신의 선택입니다, 당신은 초 단위로 제어기로 또는 템플릿 시스템으로 여전히 '싸워'할 수 있습니다 :) – biesior

+0

좋아, 나는 그걸 포기했다. 단일 기능보기 파일로 작동하도록 만들었지 만 링크 생성을 매개 변수화해야한다는 것을 깨달았습니다. 코드 가독성이 손상 될 수 있습니다. 따라서 코드 중복을 남겨두고 코드 위에 독수리 눈을 피하십시오. :) –

관련 문제