【问题标题】:Yii. Render can work as renderPartial too?易。 Render 也可以作为 renderPartial 工作?
【发布时间】:2016-11-18 21:20:51
【问题描述】:

过去,在 Yii 1 中,我使用“renderPartial”加载部分视图,如果您没有使用 renderPartial,它会加载带有布局的“部分视图”。现在在 Yii2 中,方法 renderPartial 已移至控制器,但您也可以这样做:

<?= $this->render('_form', [
    'model' => $model,
]) ?>

在另一个视图中,它的工作方式与renderPartial相同,这是什么魔法? :D。我猜在某种程度上 Yii2 会检查它是否被加载到另一个视图中并使用 renderPartial 但我无法找到它。有人找到这个吗?

我来到这个问题,因为我正在审查 Pjax,正在使用它,我看到了几个示例,其中控制器使用 return $this->render 但 Pjax 仍然有效,据我所知,如果 @987654323 Pjax 停止工作@标签或错误已在响应中找到,对吗?

【问题讨论】:

标签: php yii yii2


【解决方案1】:

所有控制器和视图render() 方法本质上都使用相同的方法,是view 模型的一部分。这是DRY中的一个关键概念(不要重复)view模型有这个方法;

public function render($view, $params = [], $context = null)
    {
        $viewFile = $this->findViewFile($view, $context);
        return $this->renderFile($viewFile, $params, $context);
    }

它所做的只是渲染$view指定的视图文件。

现在在控制器中,你有两个方法; render()renderPartial()。不同之处在于,其中一个应用了布局,而另一个则没有。代码如下所示;

public function render($view, $params = [])
{
    $content = $this->getView()->render($view, $params, $this);
    return $this->renderContent($content);
}

方法的第一行做了两件事。首先它获取视图对象,然后,通过链接,它使用该视图对象的render() 方法从该视图生成html。

然后第二行将该内容传递给控制器​​的renderContent() 方法,该方法将任何布局应用于内容。

renderPartial() 的代码是这样的;

public function renderPartial($view, $params = [])
{
    return $this->getView()->render($view, $params, $this);
}

如您所见,它与控制器的render() 方法完全相同,只是它不向控制器的renderContent() 方法传递任何内容,它只是输出。

至于您问题的pjax 部分,我猜只要您的pjax 不产生任何实质性错误,无论您使用$controller-&gt;render()$controller-&gt;renderPartial() 还是@,它都会起作用987654339@.

【讨论】:

  • 感谢您提供如此详细的答案。我的主要疑问是为什么在视图中调用渲染方法作为渲染部分而不是渲染。我在使用 Pjax 时注意到了同样的情况,我找到了一个使用渲染的示例,但是渲染假设返回视图 + 布局,所以 Pjax 不应该工作,因为它应该在存在 标签的情况下作为重定向工作。
  • 我认为你没有抓住重点。 render() 方法始终用于视图,因此在 $this-&gt;render() 的视图文件中使用。 $this 在这里指的是 view 对象。控制器通过首先使用$this-&gt;getView() 获得对view 对象的引用来实现相同的结果。这里,$this 指的是controller 对象。视图无法添加布局,因为这是由控制器正确确定的,由$this-&gt;render()$this-&gt;renderPartial() 执行此操作。视图不能添加布局。
  • 我认为你的困惑源于视图和控制器都使用了一个名为render()的方法。它们不一样,因为它们在对象中被调用。
  • 那是我的谜题中缺少的部分。我忘了控制器是负责设置布局而不是视图,谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多