Каковы лучшие практики для привязки данных в appcelerator titanium и во избежание сбоя памяти - PullRequest
0 голосов
/ 16 января 2012

Я использую пользовательские события для обработки привязки данных с помощью Titanium Appcelerator, используя событие RefreshComp для данного идентификатора объекта (уникального для всех объектов) и атрибута, передающего новое значение. Это новое значение может исходить от push-уведомления, отредактированного в приложении 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;
}

или более сложный (например, изменение фона и т. Д.)

Моя точка зрения заключается в том, что это приводит к тому, что комп привязывается к глобальному контексту, в результате чего объект не освобождается. Я попытался прикрепить пользовательское событие к самому компоненту, но оно не работает. В результате я получаю приложение, которое падает с

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x242424cf

поскольку привязка относится к компоненту, все еще находящемуся в памяти на стороне IOS, но затем, когда TiViewProxy.m вызывает родительскую функцию в _hasListeners, он не может найти родителя в памяти, который не имеет какого-либо связанного объекта, и родитель был удален из памяти

Я гуглил и смотрю на git rep в appcelerator, но такого примера нет.

1 Ответ

0 голосов
/ 16 января 2012

Есть миллионы способов обновить специальные компоненты.Я обычно склонен иметь чистую и простую структуру, где каждый файл JS состоит из одного элемента пользовательского интерфейса.это обеспечивает чистый способ управления вашим пользовательским интерфейсом.и если ваш компонент слушает событие, подобное 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);

надеюсь, это немного поможет.

...