0

我有一个用 sencha extjs 4.0.7 制作的 Web 应用程序,我希望它在移动浏览器中打开时具有不同的行为。VG 我想基于移动浏览器删除/编辑应用程序中的所有标签,而不必编辑所有应用程序。

我尝试使用前/后处理器来访问视图项,但没有成功。

Ext.Class.registerPreprocessor('test', function(cls, data, callback) {
    if(data.$className.indexOf('.view.') != -1 && ('items' in data))
    debugger;
}, true).setDefaultPreprocessorPosition('test', 'first');


Ext.ClassManager.registerPostprocessor('test1', function(cls, data, callback) {
    if(data.$className.indexOf('.view.') != -1 && ('items' in data))
    debugger;
}, true).setDefaultPostprocessorPosition('test1', 'first');

处理器在调试器语句上停止,但对象没有 items 属性。

4

1 回答 1

1

您的代码的主要问题是预处理器的名称应该是您要预处理的属性的名称(来自原型)。

Ext.Class.registerPreprocessor('title', function(cls, data) {
    data.title = data.title + ' Changed';
});   
Ext.Class.registerPreprocessor('html', function(cls, data) {
    data.html = data.html + ' Changed';
});  

Ext.define('MyPanel', {
    extend: 'Ext.panel.Panel', 
    title: 'Here it is',
    html: 'Something'
});

Ext.define('MyPanel2', {
    extend: 'Ext.panel.Panel', 
    title: 'Here it is again',
    html: 'Something else'
});

https://fiddle.sencha.com/#fiddle/n35

该文档似乎真的过时了(文档和我最初的评论所述没有回调)。这是一种私有方法,因此随着新版本的出现,它可能会中断。

我认为这不是实现您想要的东西的好方法,您正在滥用预处理器的本意,因为您没有按预期使用它。我认为如果您重新架构,它将更易于维护。我建议您创建一个包含所有标签的文件

var LABELS = { label1: 'desktop 1', label2: 'desktop 2' };

并为移动版本加载不同的文件。您的类将只引用 LABELS 对象。

Ext.define('MyPanel2', {
    extend: 'Ext.panel.Panel', 
    title: LABELS.label1,
    html: LABELS.label2
});

我的经验是,这些通过 hack 最小化更改的尝试会导致未来的维护者会骂你的代码。

于 2015-05-19T15:14:19.763 回答