2

我尝试将 Ext.Direct 与 ExtJS 4 MVC 结构一起使用,但我无法添加提供程序。

Uncaught TypeError: Cannot call method 'addProvider' of undefined调用时出现错误addProvider

Ext.Direct.addProvider(Ext.app.REMOTING_API);

我尝试launch了应用程序和init控制器。

Ext.define('Dir.Application', {
    require: [
        'Ext.direct.*',
        'Ext.data.*',
        'Ext.grid.*'
    ],
    launch: function(){
        Ext.Direct.addProvider(Ext.app.REMOTING_API);
    }
    ...
});

Ext.define('Dir.controller.Main', {
    init: function(){
        Ext.Direct.addProvider(Ext.app.REMOTING_API);
    }
    ...
});

两者都给出相同的错误。

放入代码的正确位置在哪里addProvider

更新:应用@rixo 的建议。

Ext.define('Dir.Application', {
    view:['Grid'],
    requires: [
        'Ext.direct.*',
        'Ext.data.*',
        'Ext.grid.*'
    ],
    launch: function(){
        Ext.Direct.addProvider(Ext.app.REMOTING_API);
    }
    ...
});

我的观点是定义一个商店和一个代理:

Ext.define('Dir.view.Grid', {
    extend: 'Ext.grid.Panel',
    store: {
        proxy: {
            type: 'direct',
            reader:{root: 'table'},
            api: {
                create: QueryDatabase.createRecord,
                read: QueryDatabase.getResults,
                update: QueryDatabase.updateRecords,
                destroy: QueryDatabase.destroyRecord
            }
        }
    ...
    }

现在第一个错误是好的,但我收到一个错误,抱怨QueryDatabase没有定义。它是通过提供程序定义的,但是当通过应用程序定义中的声明Ext.Direct.addProvider(Ext.app.REMOTING_API);加载视图时它还没有准备好。views: []

有没有办法让这个工作而不像我的解决方案Ext.application那样嵌套在里面? 对于 MVC 方式,没有嵌套会更好,就像在文档中解释的那样。Ext.onReady

4

4 回答 4

3

您的require应用程序定义中的 不会做任何事情。应该是复数requires

此外,您似乎已经在自己的答案中设计了这个,但这个名字Ext.direct.Manager似乎是 SenchaExt.Direct现在最喜欢的名字。

编辑

根据文档,您可以使用字符串设置直接函数。显然,这是为了解决您遇到的问题。

这应该可以解决您的问题:

api: {
    create: 'QueryDatabase.createRecord',
    read: 'QueryDatabase.getResults',
    update: 'QueryDatabase.updateRecords',
    destroy: 'QueryDatabase.destroyRecord'
}
于 2013-10-15T13:45:59.660 回答
1

可能您在调用提供者之前缺少 API 定义,请从 Sencha 的示例页面查看此定义

Ext.ns("Ext.app"); Ext.app.REMOTING_API = {
"url": "php\/router.php",
"type": "remoting",
"actions": {
    "TestAction": [{
        "name": "doEcho",
        "len": 1
    }, {
        "name": "multiply",
        "len": 1
    }, {
        "name": "getTree",
        "len": 1
    }, {
        "name": "getGrid",
        "len": 1
    }, {
        "name": "showDetails",
        "params": ["firstName", "lastName", "age"]
    }], ...}]
} };

它应该作为 javascript 文件包含在您的网页中

 <script type="text/javascript" src="api.php"></script>

这个例子

希望能帮助到你。

于 2013-10-15T09:27:36.857 回答
1

添加直接提供者最好在 Application 构造函数运行之前完成:

Ext.define('Foo.Application', {
    extend: 'Ext.app.Application',

    requires: [
        'Ext.direct.Manager',
        'Ext.direct.RemotingProvider'
    ],

    name: 'Foo',

    constructor: function() {
        Ext.direct.Manager.addProvider(...);

        this.callParent(arguments);
    }
});

Ext.application('Foo.Application');
于 2013-10-15T17:11:24.283 回答
0

我找到了这个解决方案:

Ext.require([
    'Ext.direct.RemotingProvider',
    'Ext.direct.Manager',
    'Ext.data.proxy.Direct'
]);
Ext.onReady(function(){
    Ext.direct.Manager.addProvider(Ext.app.REMOTING_API);
    Ext.application({
        name: 'Dir',
        extend: 'Dir.Application'
    });
});

它看起来不太好,因为它在 Ext.onReady 中使用了 ExtJS 4 应用程序实例化。
至少它有效。也许有更好的解决方案?

于 2013-10-15T12:50:54.843 回答