Nette框架中组件代码片段无法重绘问题咨询
解决Nette框架中组件内Snippet无法通过AJAX重绘的问题
我清楚你碰到的问题:调用handleClientChange()方法后,外层的wrapper代码片段能正常重绘,但addFormControl组件内部的clientSnippet却没更新。这是因为Nette里组件的代码片段需要通过组件实例来指定重绘,直接在presenter层面调用redrawControl()会找不到子组件内的snippet。
问题根源
你的clientSnippet是定义在addFormControl这个子组件模板里的,而当前redrawControl('clientSnippet')是在presenter上下文执行的,它只会查找presenter自身的snippet,不会遍历子组件的snippet资源。
修正后的代码方案
你需要通过组件实例来触发其内部snippet的重绘,修改handleClientChange()方法如下:
public function handleClientChange() { $this['addFormControl']['addForm']['consignment_client']->setValue("test"); $this->redrawControl('wrapper'); // 针对子组件内的snippet,通过组件实例调用重绘方法 $this['addFormControl']->redrawControl('clientSnippet'); }
额外提示
- 重绘子组件内的snippet时,必须通过组件对象调用
redrawControl(),传入该组件模板里定义的snippet名称,不能直接在presenter层面指定子组件的snippet名。 - 确认
addFormControl组件已经正确注册到presenter中,且组件模板内的snippet clientSnippet没有拼写错误。 - 如果
wrapper已经包含了整个addFormControl组件,理论上重绘wrapper也会更新组件内容,但如果需要独立更新组件内的特定snippet,上面的方法更精准高效。
内容的提问来源于stack exchange,提问作者Raj Kr
相关产品推荐
相关产品推荐

