1

我已将现有的 ExtJS 4.1.3 应用程序转换为使用 Sencha CMD 推荐的结构和工具。我首先创建了结构,然后将我现有的应用程序 JS 文件放在单页 JS 应用程序应该放置的位置。

我目前在以下位置访问我的应用程序的开发版本:

{my-server-side-app-url}/sws/dt/index.jsp

Sencha 工作区在哪里sws,Sencha单页应用程序在哪里。到目前为止,我相信没有问题。然后我运行命令:dt

sencha app build

在我app的目录中。这完成了几个Yui Compressor Warning (Trailing comma is not legal in an ECMA-262 object initializer警告,但没有错误。所以我在 URL的生产 index.jsp页面(它使用all-classes.js文件,接收上述命令的串联输出):app build

{my-server-side-app-url}/sws/build/dt/production/index.jsp

all-classes.js尝试加载理论上应该包含在其自身中的多个文件时,就会出现此问题。其中包括app.js中指定的控制器。

为什么这些文件没有被连接起来all-classes.js?下面是 Chrome 尝试从 加载它们的屏幕截图,all-classes.js当然没有找到它们。

在此处输入图像描述

我尝试了什么? 试图通过调整我app.js要求控制器requiresuses或通过此问题/答案对的建议提供所需的课程,但无济于事。

4

3 回答 3

2

尝试在. uses_requiresapp.js

请注意,如果控制器需要一些视图,您可以在 的 require 部分中省略该视图app.js,因为当 sencha 工具解析您的控制器时,它将被包含在内。

uses在将文件添加到/requires部分时尝试使用完整路径app.js。也就是说,写MyApp.controller.pages.HomeorMyApp.store.users.List但现在pages.Homeor users.List

您可以在 sencha 工具的 YUI 最小化阶段开始之前使用-before-buildAnt-after-build目标来修改您的 app.js。
在我的情况下,我最终搜索app/controller文件夹内的所有控制器并将它们的名称添加usesapp.js. 这已经足够了,因为我的控制器中需要其他需要的类。

为了能够找到 app.js 的使用部分,我使用了特殊注释

/*ant-generated-content-start*/ /*ant-generated-content-end*/

我的app.js

Ext.application({
    name: 'MyApp',
    appFolder: 'app',

    controllers: [
        "main.App"
    ],

    uses: [
        /*ant-generated-content-start*/ /*ant-generated-content-end*/
    ],
    autoCreateViewport: true,
});

我的build.xml

<?xml version="1.0" encoding="utf-8"?>
<project name="MyApp" default=".help">
    <import file="${basedir}/.sencha/app/build-impl.xml"/>

    <target name="-before-build">

        <echo message="Collecting all controllers in application class property ... "/>
        <fileset id="app_controllers" dir="${app.dir}/app/controller" casesensitive="yes">
            <include name="**/*.js"/>
        </fileset>
        <pathconvert pathsep="," property="app_controller_names" refid="app_controllers" targetos="unix">
            <chainedmapper>
                <globmapper from="${app.dir}/app/*" to="${ant.project.name}/*" casesensitive="no" handledirsep="yes"/>
                <chainedmapper>
                    <regexpmapper from="^(.*)\.js$$" to='"\1"'/>
                    <filtermapper>
                        <replacestring from="/" to="."/>
                        <replacestring from="\" to="."/>
                    </filtermapper>
                </chainedmapper>
            </chainedmapper>
        </pathconvert>
        <echo message="Collected controllers: ${app_controller_names}"/>

        <echo message="Injecting into app.js ..."/>
        <replaceregexp file="${app.dir}/app/app.js"
                       match="/\*ant-generated-content-start\*/(.*)/\*ant-generated-content-end\*/"
                       replace="/*ant-generated-content-start*/ ${app_controller_names} /*ant-generated-content-end*/"
                       byline="true"
                />
    </target>

    <target name="-after-build">
        <echo message="Reverting to original app.js ..."/>
        <replaceregexp file="${app.dir}/app/app.js"
                       match="/\*ant-generated-content-start\*/(.*)/\*ant-generated-content-end\*/"
                       replace="/*ant-generated-content-start*/ /*ant-generated-content-end*/"
                       byline="true"
                />
    </target>

</project>
于 2013-02-08T14:41:54.380 回答
0

我仍然不完全理解这个问题,但这就是我为解决这个问题所做的。

我有两个模型;App.js并且Window.js分别有一个hasManybelongsTo关系。在App.js

associations: [{
    type : 'hasMany',
    model: 'WD.model.Window',
    name : 'windows'
}]

Window.js我有:

associations: [{
    type : 'belongsTo',
    model: 'WD.model.App',
    associationKey: 'appId'
}]

我开始怀疑这些部分会导致问题,因为它们是唯一提供404;的 ExtJS 模块。其他提供 a 的模块404取决于使用hasMany和的模型文件belongsTo

我只是删除了associations上面粘贴的片段(因为现在我没有使用它们,因为它们并没有真正起作用,因为我仍然必须自己加载数据,而不是自动加载孩子)。然后重新运行sencha app build,生产版本正常工作!

如果有人(尤其是来自 Sencha 的人)确切地知道我笨拙的修复工作的原因,请回答下面的问题或评论,我会更新答案。

感谢@bhovhannes的回答,这仍然导致对问题的有用洞察;+1ed。

于 2013-02-08T15:32:37.530 回答
0

我也有同样的问题,为了解决这个问题,我只是更改了类的名称。我使用 SenchaCmd 3.1.xx 和 Sencha Touch 2.2 构建

于 2013-06-20T08:29:35.470 回答