Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Foreach和AfterAdd进行Knockoutjs动态模板绑定_Javascript_Templates_Dynamic_Binding_Knockout.js - Fatal编程技术网

Javascript 使用Foreach和AfterAdd进行Knockoutjs动态模板绑定

Javascript 使用Foreach和AfterAdd进行Knockoutjs动态模板绑定,javascript,templates,dynamic,binding,knockout.js,Javascript,Templates,Dynamic,Binding,Knockout.js,我想做的是将动态模板绑定到observableArray,并使用指定“afterAdd”和“beforeRemove”的选项。通过查看我的代码可能更容易理解: <div id="form_container" data-bind="template: {name: fnGetTemplate, foreach: OpenedForms(),

我想做的是将动态模板绑定到observableArray,并使用指定“afterAdd”和“beforeRemove”的选项。通过查看我的代码可能更容易理解:

<div id="form_container" data-bind="template: {name: fnGetTemplate,
                                               foreach: OpenedForms(),
                                               beforeRemove: fnBeforeRemoveProcess(),
                                               afterAdd: fnAfterAddProcess()}"></div>
<div id="form_container" data-bind="template: {name: fnGetTemplate,
                                               foreach: OpenedForms(),
                                               beforeRemove: fnBeforeRemoveProcess,
                                               afterAdd: fnAfterAddProcess}"></div>

(简化版)OpenedForms=ko.observatarray()[{Template:'Template1'},{Template:'Template2}]

fGetTemplate接收数组元素并返回模板名称,例如“Template1”

数组中的所有内容都被渲染;但是,问题是fneafteraddprocess/fnebeforeremoveprocessfgetTemplate之前被调用。所以它实际上是在调用afterAdd和afterRemove之后呈现模板。我尝试用afterRender替换afterAdd,但同样的事情发生了。由于某种原因,当我只向observableArray添加了一个元素时,它实际上调用了fnBeforeRemoveProcess->->fnGetTemplate

但是,除了不支持“beforeRemove”之外,它工作正常:


也许我需要编写一个自定义绑定,但如果有人能指出我哪里出了问题,或者有更好的方法来解决这个问题

谢谢

但是,问题是在fGetTemplate之前调用fAfterAddProcess//fnBeforeRemoveProcess

这是因为您正在调用绑定中的函数,所以它们在解析绑定字符串时运行。您只需在绑定中传递对函数的引用:


<div id="form_container" data-bind="template: {name: fnGetTemplate,
                                               foreach: OpenedForms(),
                                               beforeRemove: fnBeforeRemoveProcess,
                                               afterAdd: fnAfterAddProcess}"></div>