Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/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
Jsrender JsViews:使用深度复制对象重新初始化模板:~根问题_Jsrender_Jsviews - Fatal编程技术网

Jsrender JsViews:使用深度复制对象重新初始化模板:~根问题

Jsrender JsViews:使用深度复制对象重新初始化模板:~根问题,jsrender,jsviews,Jsrender,Jsviews,我正在尝试使用数据链接对象的深度副本创建撤消过程(重新初始化模板)。这可能不是一个理想的方法,但我现在不能使用视图模型、merge()和unmap() mainObject呈现templateA(mainObject派生自AJAX请求,类型:json) mainObject=$.extend(true、mainObject、addObject);添加用于编辑目的的其他对象,呈现templateB(addObject派生自AJAX请求,类型:json) 我已经使用上面两个模板和对象很长一段时间了

我正在尝试使用数据链接对象的深度副本创建撤消过程(重新初始化模板)。这可能不是一个理想的方法,但我现在不能使用视图模型、merge()和unmap()

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
    访问(第一个对象被扩展)
我尝试过在JSFIDLE中重现这个问题,但失败了……尽管数据/模板有限

控制台日志显示所有对象的格式正确

如何在某些或所有对象上创建/初始化
~root

哪些代码冲突可能会改变
~root
上下文

如有任何提示或建议,将不胜感激


更新

虽然我已经注释掉了所有的帮助程序,等等,以简化模板+数据(打开调试)…但根问题仍然存在。这“最终”让我相信这与模板或数据无关

下面是我的设想:

  • TemplateA是使用带有DataA的link()呈现的(无问题)
  • TemplateB是使用link()和深度复制/克隆对象(DataA+DataB)(~root问题)呈现的
  • 模板A和B共享通用的双向数据链接项,尽管它们来自不同的数据源
如果我将TemplateA render方法更改为render()(而不是link());然后渲染TemplateB,~根上下文起作用

另一个场景:我没有使用deep copy/clone对象(DataA+DataB)呈现TemplateB,而是将服务器上的数据组合起来,并针对该对象进行呈现。这也产生了~root上下文问题

然后我想,当从多个模板调用link()时,可能会出现一个问题,即它们具有相同名称的对象会发生冲突。因此,我隔离了一个常见对象,将其重命名,并呈现了一个名称发生更改的测试模板……~根问题仍然存在


我现在只知道这些;-)

在这里回答我自己的问题

这里的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的问题。