由于templateShareable,SAPUI5错误消息的解决方案:true?

时间:2015-11-02 12:15:05

标签: data-binding sapui5

自SAPUI5 1.28.20升级以来,我收到以下错误消息:

  

共享模板必须使用templateShareable标记:true   绑定信息

代码在MangedObject.js中,如下所示:

        } else if ( oBindingInfo.templateShareable === MAYBE_SHAREABLE_OR_NOT ) {
            // a 'clone' operation implies sharing the template (if templateShareable is not set to false)
            oBindingInfo.templateShareable = oCloneBindingInfo.templateShareable = true;
            jQuery.sap.log.error("A shared template must be marked with templateShareable:true in the binding info");
        }

oBindingInfo.templateShareable的值为trueMAYBE_SHAREABLE_OR_NOT的值为1。

根据文档,默认oBindingInfo.templateShareabletrue

那么这里有什么问题?图书馆里的一个错误?或者我的代码? 另见:https://sapui5.netweaver.ondemand.com/sdk/#docs/api/symbols/sap.ui.base.ManagedObject.html

SAPUI5版本1.32.x的更新

对于版本1.32.x,消息已更改,现在是:

  

模板在绑定中重用,但已标记为   毁灭的候选人。你最好应该声明这样的用法   templateShareable:绑定配置中为true。 -

但根据文档,默认值仍应为true:

  

{boolean} oBindingInfo.templateShareable?,默认值:true选项   使模板可以共享,这意味着它不会   自动销毁或克隆

现在看来,这会产生一些无休止的负载,我一次又一次地收到此消息,直到浏览器崩溃。 任何人都知道什么可能是错的?

2 个答案:

答案 0 :(得分:4)

如果模板在绑定之外被实例化,则看起来会出现消息。例如:

此代码可以使用:

new sap.m.Select({
    items : {
        path : "/Items",
        template : new sap.ui.core.Item({
            text : "{Name}"
        }) 
    }
}) 

此代码似乎产生了消息:

var oTemplate = new sap.ui.core.Item({
    text : "{Name}"
}) 


new sap.m.Select({
    items : {
        path : "/Items",
        template :oTemplate
    }
})

这似乎解决了这个问题:

var oTemplate = new sap.ui.core.Item({
    text : "{Name}"
}) 


new sap.m.Select({
    items : {
        path : "/Items",
        template :oTemplate,
        templateShareable : true
    }
})

答案 1 :(得分:2)

上面标记为正确的答案实际上根本不正确,因为这是错误的:

  

如果模板在外部实例化,则看起来会出现消息   绑定。 [...]此代码似乎产生了这样的信息:[...]

为了证明上面的答案错误,你自己运行这个例子(SAPUI5 1.28.20有相同的结果):



<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>SAPUI5 single file template | nabisoft</title>

        <script 
            src="https://openui5.hana.ondemand.com/1.36.12/resources/sap-ui-core.js"
            id="sap-ui-bootstrap"
            data-sap-ui-theme="sap_bluecrystal"
            data-sap-ui-libs="sap.m"
            data-sap-ui-compatVersion="edge"
            data-sap-ui-preload="async"></script>
            <!-- use "sync" or change the code below if you have issues -->
 
        <script>
            sap.ui.getCore().attachInit(function () {
                "use strict";
                
                var oModel = new sap.ui.model.json.JSONModel({
                    Items: [
                        {Name: "Michael"},
                        {Name: "John"},
                        {Name: "Frank"},
                        {Name: "Jane"}
                    ]
                });                
                sap.ui.getCore().setModel(oModel);
                
                var oTemplate = new sap.ui.core.Item({
                    text : "{Name}"
                });
              
                new sap.m.Select({
                    items : {
                        path : "/Items",
                        template : oTemplate
                    }
                }).placeAt("content");
            });
        </script>
 
    </head>
 
    <body class="sapUiBody">
        <div id="content"></div>
    </body>
</html>
&#13;
&#13;
&#13;

基本上,UI5中缺少明确的模板生命周期定义。当检测到这个问题时,已经有很多旧的应用程序...所以现在这个新的&#34;功能&#34;去年推出了一些(这是一种向后兼容)。 UI5尝试自动检测开发人员关于绑定中使用的给定模板的生命周期的意图(使用一些启发式)。如果UI5无法清楚地告诉开发人员实际需要什么,那么您将看到此错误日志 - 这实际上根本不会影响功能。它只是告诉开发人员,某个地方有一个模板,它不会被UI5运行时破坏。换句话说,如果你设置templateShareable = true,那么你应该确保销毁模板以避免内存泄漏。因此,只需设置 templateShareable = true 就不是全部......

我发布了一篇详细的博客:Understanding templateShareable in SAPUI5