我正在使用Openui5。有一个UI控制按钮的构造函数,无法看到按钮的原型属性,但在浏览器控制台中执行时相同的东西,显示出!

 sap.m.Button.prototype.Move = function(){
  console.log('Move');
} 
var oButton = new sap.m.Button({text:"Hello"});
oButton.Move(); // throws undefined function! 
.

在控制台中执行浏览器时相同的代码,它有效!

jsbin - > http://jsbin.com/tepum/1/edit

有帮助吗?

解决方案

运行代码后,我发现创建SAP.M.Button的第一个实例导致脚本更改SAP.M.Button的原型。它在JavaScript中有效,但如果你问我,那就没有很聪明。

第一个创建会导致同步请求(否也不错)来获取库参数。

如果第二次运行代码,它将有原型。是因为创建按钮实例不会更改按钮.Prototype。

首都m在移动时会建议一个构造函数,所以我会建议将其更改为小写。

由于获取参数是同步的,您可以创建第一个实例,然后设置原型:

console.log("First Button creation changes Button.prototype");
var oButton = new sap.m.Button({text:"Hello"});
sap.m.Button.prototype.move = function(){
  console.log('Move');
} 
oButton.placeAt('content');
oButton.move(); // logs Move
.

我的猜测是,这是对懒惰的加载控件完成的,如果永远不会创建一个按钮,则不会为这些未使用的控件加载JSON配置文件。它有几个缺点。

  1. 您必须先创建一个实例,然后才能设置原型。
  2. 配置文件同步加载,因此在创建具有慢速连接的许多控件的第一个实例时会导致应用程序无响应。
  3. 更好的方法是出厂函数返回承诺,因此每次都会以相同的方式创建控件,并且配置文件可以异步获取。

    [更新]

    查看配置它似乎是整个GUI库的配置,所以我看不到为什么只在创建一个实例后加载它的任何原因。更改它在创建实例时更改对象定义的库并不是很容易扩展,因为它是不可预测的。如果它只更改了第一次创建的原型,那么它应该很好,但看起来库的制造商不希望人们扩展它,或者他们不会使对象定义不可预测。如果有一个API文档可用,则可能会尝试检查。

    [更新]

    似乎是扩展控件的“正确”方式是使用扩展

其他提示

@hmr 正确扩展控件的正确方法是通过使用UI5管理对象提供的扩展功能,查看 http://jsbin.com/linob/1/edit

在下面的示例下,当其他人调试时,您会注意到控制在需要时加载懒惰,您在加载时丢失的任何更改?

    jQuery.sap.declare("my.Button");
    jQuery.sap.require("sap.m.Button");
    sap.m.Button.extend("my.Button", {
        renderer: {} 
    });

    my.Button.prototype.Move = function() {
        console.log('Move');
    };

    var oButton = new my.Button({
        text: "Hello"
    });
    oButton.placeAt('content');
    oButton.Move();
.

它没有隐藏原型本身。如果构造函数函数通常退出,那么您可以获得该函数的原型。但是,如果构造函数实际返回一些其他对象,那么您可以获得其他对象的原型,因此它不适用于假设只要因为您调用新的按钮()时,您将在您将在任何内容中看到新的按钮你回来了。我敢肯定,如果您解除了该代码,您会发现您所在的构造函数有一个“返回新的某些otherothstanceofbutton()”在它的末尾。

编辑:好的,看起来有点难以看出那个SAP代码中真正发生的事情,但它看起来他们有覆盖控件的原型来为它们添加要素,例如:sap.ui.core.enabledPropager ,并且在您实际实例化按钮之前,不会运行这些事情。因此,如果更改代码以实例化页面上的按钮,然后添加到它的原型,然后构造并调用方法,它可以正常工作。如:

http://jsbin.com/benajuko/2/edit

所以我猜我的答案是,当你从控制台运行它时,它已经完成了与该原型的弄脏,而在您的测试中,您正在添加到原型,然后第一次构建按钮(再次改变原型)然后试图打电话给你的旧,这不再在那里。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top