[英]What are the best practises for data binding in appcelerator titanium and avoid memory crash
我一直在使用自定義事件來處理與鈦appcelerator的數據綁定,對於給定的對象ID(所有對象唯一)和傳遞新值的屬性,使用稱為RefreshComp的事件。 這個新值可能來自推送通知,您希望在iphone應用中編輯的對象要傳播到所有伴奏等。
Titanium.App.fireEvent(RefreshComp, {
refreshid : objectId + '-' + attribute,
value : newvalue
});
和
function registerEvent(objectId,attribute,eventHandler){
Titanium.App.addEventListener(RefreshComp, function(e) {
if((e.refreshid === (objectId + '-' + attribute))) {
eventHandler(comp, e.value);
}
});
}
然后您的eventHandler函數可能像
function eventHandler(comp,newvalue){
comp.value = newvalue;
}
或更復雜(例如更改背景等...)
我的觀點是,這會使comp綁定到全局上下文,從而導致對象無法釋放。 我嘗試將自定義事件附加到組件本身,但是它不起作用。 結果,我得到了崩潰的應用程序
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x242424cf
因為綁定引用的組件仍然在IOS端的內存中,但是當TiViewProxy.m在_hasListeners中調用父函數時,它無法在內存中找不到沒有任何關聯對象的父對象,並且該父對象已經被從內存中刪除
我已經用谷歌搜索並查看了appcelerator的git rep,但是沒有這個例子。
有數百萬種刷新特殊組件的方法。 我通常傾向於使用一種干凈簡單的結構,其中每個js文件都由一個ui元素組成。 這提供了一種管理用戶界面的干凈方法。 如果您的組件偵聽諸如globalRefreshEvent之類的事件,它將刷新自身。
createMyComponent = function(_args){
var myComp = Ti.UI.createWhatEver({
property0 = _args.prop0 || "defaultValueForProp0"
property1 = _args.prop1 || "defaultValueForProp1"
value = _args.value || "defaultValueForValue"
});
myComp.refreshValue = function(_newValue){
myComp.value = _newValue;
};
Ti.App.addEventListener('globalRefreshEvent',function(e){
myComp.refreshValue(e.value)
});
return myComp;
};
像這樣創建您的伴奏:
var comp = createMyComponent();
view.add(comp);
希望它能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.