我使用 Backbone 路由器对 Yii 操作进行 ajax 调用,从而加载部分视图
this->renderPartial('_foo',null,false,true);
但是当我多次使用同一个 ajax 调用时,问题就出现了,它一次又一次地从局部视图加载所有脚本,这反过来又破坏了应用程序。
有没有办法使用相同的动作调用模式来解决这个问题?或者如果不是我应该如何让 Yii 和 Backbone 合作?
我使用 Backbone 路由器对 Yii 操作进行 ajax 调用,从而加载部分视图
this->renderPartial('_foo',null,false,true);
但是当我多次使用同一个 ajax 调用时,问题就出现了,它一次又一次地从局部视图加载所有脚本,这反过来又破坏了应用程序。
有没有办法使用相同的动作调用模式来解决这个问题?或者如果不是我应该如何让 Yii 和 Backbone 合作?
当涉及到需要加载额外脚本的元素的 ajax 调用时,Yii 小部件的设计非常糟糕。
bool.dev 在评论中发布的解决方案是我处理此问题的首选方式,但还有其他方法,如果无论出于何种原因(您似乎就是这种情况)都不起作用。
在您的主视图文件(您使用 render() 调用的文件,而不是 partialRender() 调用的文件)中,包括以下内容:
$this->renderPartial('_foo',null,true,true);
这将强制您的主页调用(因此,在 ajax 调用之前)包含脚本。由于第三个参数现在为真,它将以字符串的形式返回内容,然后由于我们没有将其存储在任何地方而被丢弃。
然后对于 ajax 调用,使用
$this->renderPartial('_foo',null,false,false);
要不就
$this->renderPartial('_foo');
因为最后 3 个参数只是默认值。
这将防止脚本被多次加载,但仍然存在,因为它们存在于原始页面加载而不是 ajax 调用中。
根据您的_foo
视图文件中的内容,您可能需要制作一个特殊文件。所需要的只是您想要脚本文件的小部件的虚拟用法。
请记住,您要做的只是强制小部件在主页调用上运行,以便它注册其脚本,然后丢弃剩余的输出。然后在 ajax 调用中通过将 processOutput 参数设置为 false 来忽略它注册的所有脚本。