Jsrender JsViews:使用深度复制对象重新初始化模板:~根问题
我正在尝试使用数据链接对象的深度副本创建撤消过程(重新初始化模板)。这可能不是一个理想的方法,但我现在不能使用视图模型、merge()和unmap()Jsrender JsViews:使用深度复制对象重新初始化模板:~根问题,jsrender,jsviews,Jsrender,Jsviews,我正在尝试使用数据链接对象的深度副本创建撤消过程(重新初始化模板)。这可能不是一个理想的方法,但我现在不能使用视图模型、merge()和unmap() mainObject呈现templateA(mainObject派生自AJAX请求,类型:json) mainObject=$.extend(true、mainObject、addObject);添加用于编辑目的的其他对象,呈现templateB(addObject派生自AJAX请求,类型:json) 我已经使用上面两个模板和对象很长一段时间了
mainObject
呈现templateA(mainObject派生自AJAX请求,类型:json)
mainObject=$.extend(true、mainObject、addObject)
;添加用于编辑目的的其他对象,呈现templateB(addObject派生自AJAX请求,类型:json)
我已经使用上面两个模板和对象很长一段时间了
现在
我想对mainObject
进行深度复制/克隆,以防用户取消编辑(双向数据链接)
当我创建mainObjectClone=JSON.parse(JSON.stringify(mainObject))
并使用相同的模板templateB重新渲染时,我得到了与context~root
相关的错误
据我所知,JSON.parse()返回与AJAX请求相同类型的对象,类型为:JSON
对象未返回或出现以下错误:uncaughttypeerror:无法读取未定义的
的属性“0”。+((v=view.ctxPrm(“根”).myPhotos[j.(u sq(0)]!=null?v:)
启用“调试”后,模板的所有部分都可以正常渲染,但使用~root
的部分除外
奇怪的是,~root
在我在模板中定义的地方不起作用……但是在进一步的测试中,如果我将~root
添加到一个“不同”的顶级对象(不需要上下文的对象)中,它会在那里起到奇怪的作用
我已经试过了,所有这些都是在~root
上中断的:
myObjectClone=$.extend(true,{},mainObject)
- 深拷贝
- 另外,将对象顺序
反转为mainObject,addObject
也会中断mainObject=$.extend(true,addObject,mainObject)
访问(第一个对象被扩展)~root
~root
哪些代码冲突可能会改变~root
上下文
如有任何提示或建议,将不胜感激
更新 虽然我已经注释掉了所有的帮助程序,等等,以简化模板+数据(打开调试)…但根问题仍然存在。这“最终”让我相信这与模板或数据无关 下面是我的设想:
- TemplateA是使用带有DataA的link()呈现的(无问题)
- TemplateB是使用link()和深度复制/克隆对象(DataA+DataB)(~root问题)呈现的
- 模板A和B共享通用的双向数据链接项,尽管它们来自不同的数据源
我现在只知道这些;-) 在这里回答我自己的问题 这里的JsViews没有问题…root的问题是我自己造成的;-) 该问题是由于将link()templateB注入link()templateA…从而与~root产生冲突造成的 我的数据源和模板曾经是组合在一起的……我为了测试而拆分它们,但没有清晰地思考 基本上我是这样做的:
<script id="templateA" type="text/x-jsrender">
<div id="userView">...</div>
<div id="editView"></div>
</script>
<script id="templateB" type="text/x-jsrender">
...
</script>
$.templates("#templateA").link("#userView", dataA)
onClick openEditView...
$.templates("#templateB").link("#editView", $.extend(true, dataA, dataB))
...
...
$.templates(“#templateA”).link(“#userView”,dataA)
单击OpenEdit视图。。。
$.templates(“#templateB”).link(“#editView”,$.extend(true,dataA,dataB))
修复非常简单,如下所示:
<script id="templateA" type="text/x-jsrender">
<div id="userView">...</div>
{{if editable}}
{{include tmpl="templateB" /}}
{{/if}}
</script>
<script id="templateB" type="text/x-jsrender">
...
</script>
$.templates("#templateA").link("#userView", dataA)
onClick openEditView...
$.extend(true, dataA, dataB))
...
{{如果可编辑}}
{{include tmpl=“templateB”/}
{{/if}
...
$.templates(“#templateA”).link(“#userView”,dataA)
单击OpenEdit视图。。。
$.extend(true、dataA、dataB))
这解决了~root问题,深度复制对象方法现在也可以工作。我试图复制您的问题,但没有遇到错误。我想如果没有样品,你的问题很难解决。您可以尝试创建一个显示错误场景的JSFIDLE吗?否则,试图解释它将是困难和费时的。@Borismore我想出来了,答案贴出来了,而不是JsViews的问题。