0

我有一个特点写如下:

trait NewTrait { 
  def NewTrait(f: Request[AnyContent] => Result):  Action[AnyContent] = {
    Action { request =>
      implicit val newTrait = new model.helper.newTrait
      f(request) 
    }
  }
}

还有一个使用该特征的控制器,并尝试将隐式 val newTrait 传递给视图:

object Test extends Controller with NewTrait {

  def foo(num: Int) = NewTrait { request =>
    val view = (views.html.example.partials.viewWrap)       
    Ok(views.html.example.examplePage(views.html.shelfPages.partials.sidebar())
}

在 foo 中,newTrait 不在范围内,但是将其纳入范围的最佳实践是什么?对于收到的每个请求,它必须是唯一的。如果我从 foo 中重新声明隐式 val,它会起作用,但我必须每次在控制器中重复该声明,如果我可以将其隐藏在 trait 中,代码看起来会更清晰。有什么方法可以将特征中的隐含值传递给控制器​​?

4

3 回答 3

0

你可以有:

trait NewTrait {
    def gotRequest(req:Request) = {
        implicit val newTrait = new model.helper.newTrait
        // don't have to pass the newTrait parameter here 
        // explicitly, it is used implicitly
        Whatever.f(request)
    }
}

和:

object Whatever {
    def f(req:Request)(implicit val newTrait:NewTrait) = {
        //newTrait is in scope here.

        //...the rest of your code
    }
}
于 2013-02-14T01:38:15.770 回答
0

使所述 val 成为字段变量:

trait NewTrait { 
  implicit val newTrait = new model.helper.newTrait
  ...
}

现在它将在方法foo范围内。

于 2013-02-13T18:49:03.143 回答
0

尽管我发现名称有点混乱(可能是示例代码),但您可以这样做:

trait NewTrait {
  def NewTrait(f: Request[AnyContent] => model.helper.newTrait => Result): Action[AnyContent] = {
    Action { request =>
      val newTrait = new model.helper.newTrait
      f(request)(newTrait)
    }
  }
}

在使用它的代码中:

object Test extends Controller with NewTrait {
  def foo(num: Int) = NewTrait { request => implicit newTrait =>
    Ok
  }
}
于 2013-02-13T19:47:01.880 回答