2016-04-01 15 views
3

Yeni bir sap.ui.define modelinde özel denetim yazmak istiyorum. Denetim işleyicisini ayrı bir dosyada uyguladığımda bir sorunum var: bExport = true, bu ise forbidden by SAP."sap.ui.define" stilinde SAPUI5 denetim işleyicisinin yazılması

bExport: Küresel adlarına bir ihracat gerekli olup olmadığını - Ben ihracat kesmek kullanmaz oluşturucu uygulamalarının herhangi örneklerini bulamadı SAP sahip olduğu kod sadece

tarafından kullanılmalı ve Böyle bir şekilde var olursam şüphem var.

Ben bazı öneriler var, ancak bunlar tam olarak beni tatmin etmiyor:

  • SAP gereksinimi yok saymak ve bExport = true kullanın. Artıları: SAP kodunun en yüksek tekrarı ve genellikle standart mantığı takip edin. Eksileri: resmi önerilerden kaçınmak.
  • my.namespace.control.GreatControlRenderer Açık olarak fabrika işlevinin içinden ayarlanır. Artıları: Basit, bExport'a dokunmuyor. Eksileri: modüler tasarımı bozar (modül aslında global değişkeni ayarlar).

Bu sorunu çözmek için en iyi veya önerilen yol nedir?


genel kullanım için uygun teknik, bir amacı, bir referans jQuery.sap.setObject yöntemi ile çerçeve kodu içinde oluşturulur

, hem de:

  1. sap.ui.core.Control.extend() - aslında üst sınıf yöntemi içinde sap.ui.base.Metadata.createClass()
  2. sap.ui.define(/* bExport = */ true)

Bu yöntem, global sco'ta nesnelerin hiyerarşisini oluşturur aşağıdaki gibi nesne dot.separated.qualified.name tarafından pe:

jQuery.sap.setObject = function(sName, vValue, oContext) { 
    var oObject = oContext || window, 
     aNames = (sName || "").split("."), 
     l = aNames.length, 
     i; 

    if (l > 0) { 
    for (i = 0; oObject && i < l - 1; i++) { 
     if (!oObject[aNames[i]]) { 
     oObject[aNames[i]] = {}; 
     } 
     oObject = oObject[aNames[i]]; 
    } 
    oObject[aNames[l - 1]] = vValue; 
    } 
}; 

cevap

3

İlk olarak, Renderer bir hale fonksiyonu ile bir nesne olduğunu. Bu statik bir işlev. Bu Renderer'ı modülünüzden döndürün.

sap.ui.define([], function(){ 
    var MyControlRenderer = {}; 
    MyControlRenderer.render = function(oRm, oControl){ 
    //Render your control 
    }; 
    return MyControlRenderer; 
}); 

Sonra kontrolünde size Renderer nesnesi içe ve bunun gibi sizin kontrolünüz işleyici özelliğine atayın: Oluşturucu kontrolü gibi aynı dizinde Bu örnekte

sap.ui.define([ 
"sap/ui/core/Control", 
"./MyControlRenderer" 
], function (Control, MyControlRenderer) { 
    var MyControl = Control.extend("bla.MyControl", { 
    metadata: { 
     //... 
    }, 
    renderer: MyControlRenderer 
    }); 
    return MyControl; 
}); 

.

+0

"MyControl = Control.extend ..." olması gerektiğini düşünüyorum. – hirse

+0

Sağ. Düzeltildi. Teşekkürler! – schnoedel

+0

+ 1ed. Ancak, bu yaklaşımın TooltipBase gibi diğer soyut modüllerden herhangi bir “renderer” içermediğinden (UI5 mevcut olmayan * TooltipBaseRenderer *'ı almaya çalıştığından) şu anda çalışmadığını fark ettim. 'BExport' öğesine geri dön. :(https://embed.plnkr.co/33zFqa/ – boghyon

İlgili konular