Магазин не синхронизируется, когда функция синхронизации переопределена Sencha Touch 2.3

Я создаю автономный режим для своего приложения, и мне нужно переопределить функцию синхронизации в моих магазинах. Однако, когда я делаю это, магазин больше не синхронизируется, даже когда я вызываю this.callParent(arguments).

Вот переопределенная функция:

sync: function(){
    if(appOnline){
        console.log('App is online');
        this.callParent(arguments);
    }   
    else{
        console.log('App is offline');
        var found = false;

        for(var i = 0; i < storeSyncList.length; i++){
            if(storeSyncList[i] === this){
                found = true;
                break;
            }
        }

        if(!found)
            storeSyncList.push(this);
    }   
}

Почему this.callParent(arguments) не работает? Когда приложение подключается к сети, функция вызывается следующим образом:

storeSyncList[i].sync.call(storeSyncList[i],{
    scope: this,
    callback: function(records, operation, success){
        console.log('test1');
        console.log('successful sync: '(success ? 'Yes' : 'No'));
    }
});

Как видно по звонку, я прохожу в магазине как this часть sync.call(). storeSyncList[i] — это текущий магазин, который синхронизируется, когда приложение снова подключается к сети.

Кто-нибудь знает, почему this.callParent(arguments) не выполняет синхронизацию, когда this является магазином? Я знаю, что это не так. Когда я смотрю на базу данных, она не обновляется, и функция callback никогда не вызывается. Однако я точно знаю, что он работает на линии sync.call. Что тут происходит?

ОБНОВЛЕНИЕ: после построчной отладки вызов this.callParent(arguments) пропускается. Я не могу войти в функцию, и она никогда не запускается, программа просто проходит по ней, как будто ее там нет, и идет в конец функции. Очень странно. Кто-нибудь знает, почему?

РЕДАКТИРОВАТЬ: Синхронизация Pastebin всего класса http://pastebin.com/WMZTh5PR находится внизу.


person Graham    schedule 04.04.2014    source источник
comment
Можете ли вы показать мне весь код вашего AppStore? Вы добавили опцию переопределения? Когда я говорю appStore, я имею в виду ваш основной магазин, который вы хотите заменить всеми другими магазинами.   -  person Scoup    schedule 04.04.2014
comment
@Scoup Не уверен, что это за опция переопределения, но вот ссылка на магазин, функция синхронизации внизу: pastebin. com/EqrqgA68   -  person Graham    schedule 04.04.2014
comment
@Scoup вот pastebin с подсветкой синтаксиса: pastebin.com/WMZTh5PR   -  person Graham    schedule 04.04.2014


Ответы (1)


Если вам нужно переопределить какой-то объект, лучше всего использовать опцию «переопределить».

Ext.define('Airit.store.App', {
    override: 'Ext.data.Store',
    sync: function() {
       this.callParent(arguments)
       //etc
    }
});

Просто используйте для этого «require».

person Scoup    schedule 04.04.2014
comment
Чем это отличается от extend? - person Graham; 04.04.2014
comment
Глядя на определение override здесь: docs.sencha.com/core/manual/ content/classsystem.html Переопределение не похоже на то, что мне нужно. В этом случае мне определенно нужно создать новое определение класса. - person Graham; 04.04.2014
comment
Хун... Я понял. Используйте console.log(this) в своей синхронизации, чтобы узнать, кто это. - person Scoup; 04.04.2014
comment
Вы можете увидеть имя объекта и убедиться, что это то, что вы ожидаете. - person Scoup; 04.04.2014
comment
Я сделал это до того, как опубликовал этот вопрос. this относится к магазину, как и должно быть. Я упомянул об этом в исходном вопросе. - person Graham; 04.04.2014
comment
Извините, но я не могу найти проблемы с вашим кодом. Вы можете попробовать переопределить dataStore.sync и посмотреть, вызывается ли он. - person Scoup; 04.04.2014