EXT.NET:“;未捕获的类型错误:无法读取属性'数据'未定义的“;将记录添加到存储时

EXT.NET: "Uncaught TypeError: Cannot read property 'data' of undefined" when adding record to store

本文关键字:未定义 数据 存储 添加 记录 NET 类型 错误 读取 EXT 属性      更新时间:2023-09-26

我整个下午都在为这个问题而挣扎,在网上找不到任何可行的解决方案,所以我们开始吧。我会尽我最大的努力彻底解决我的问题,因为我已经总结了它的主要元素(换句话说,我在这里的一些代码将是一个简化的例子,我将在这里和那里讲述一些故事,以更好地理解)。首先,我使用EXT.NETMVC模型,并且在很大程度上使用标记。所以,这是我的商店(实际代码):

        <ext:Store ID="storeActivityProjectHistory" runat="server" UseIdConfirmation="true">
            <Reader>
                <ext:JsonReader IDProperty="idProject">
                    <Fields>
                        <ext:RecordField Name="idActivity" Type="Int" />
                        <ext:RecordField Name="idProject" Type="Int" />
                        <ext:RecordField Name="nmProject" Type="String" />                             
                        <ext:RecordField Name="csStatus" Type="String" />                        
                        <ext:RecordField Name="dsDetails" Type="String" />
                        <ext:RecordField Name="dtDate" Type="Auto" DateFormat="MM/yyyy" />                              
                    </Fields>
                </ext:JsonReader>
            </Reader>
        </ext:Store>   

一点见解:一个活动可能包含几个项目。通常人们会期待另一种方式,但事实并非如此。这是我链接到这个商店的网格(为了简单起见,我从这个商店中删除了几个标签):

    <ext:GridPanel ID="grdActivityProjectHistory" runat="server" StripeRows="true" Title='<%# Html.GetText("History") %>' Width="621" AutoHeight="true" 
        StoreID="storeActivityProjectHistory">
        <ColumnModel>
            <Columns>
                <ext:Column ColumnID="idActivity" DataIndex="idActivity" Hidden="true" />
                <ext:Column ColumnID="idProject" DataIndex="idProject" Hidden="true" />
                <ext:Column ColumnID="nmProject" Header="Project" DataIndex="nmProject" Width="250" />
                <ext:Column ColumnID="dsDetails" DataIndex="dsDetails" Hidden="true" />
                <ext:Column ColumnID="csStatus" Header="Status" DataIndex="csStatus" Width="75" />
                <ext:DateColumn ColumnID="dtDate" Header="Date" DataIndex="dtDate" Width="75" Format="MM/yyyy" />
            </Columns>
        </ColumnModel>
    </ext:GridPanel>

现在,有一些解释:每当创建"活动"时,用户可能会将一个或多个项目链接到它。此外,他可以更改此链接的状态,以标记该项目在"活动"中是活动的还是非活动的。这个链接中的更改必须存储在历史记录中,这就是上面的网格和存储提供的支持

无论何时创建此链接,它都必须处于活动状态并具有默认详细信息("已创建记录")。由于这是一种默认行为,并且我们使用了大量存储过程来处理数据库,所以我认为每当创建新链接时,我都可以直接从SP将这些值插入数据库换句话说,每当创建链接时,历史上就已经有一条记录了

这就是我在加载活动时将所述记录加载到存储中的方式,也就是我想的,将事情搞砸的第1部分(不要担心projectId变量):

    var fillActivityProjectStore = function(projectId) {
        var activityProjectHistoryList;
        currentProjectHistoryList = new Array();
        if (loadedActivity.activityProjectHistoryList!= null) {
            activityProjectHistoryList = loadedActivity.activityProjectHistoryList.Original;
            activityProjectHistoryList.forEach(function(activityProjectHistory) {
                if (activityProjectHistory.cdProject == projectId) 
                    currentProjectHistoryList.push(activityProjectHistory);
            });
            storeActivityProjectHistory.loadData(currentProjectHistoryList);
        }
    }

对这种明显混乱的解释是:loadedActivity.activityProjectHistoryList.Ooriginal保存链接到当前加载的活动的所有项目的所有历史信息,在这里我只选择与其中一个项目相关的信息并加载到存储中。

而且,对于gran的结局,每当我试图改变这个链接的状态(它应该在网格中添加第二行,在已经加载的当前行下)时,都是当我收到可怕的"未捕获类型错误:无法读取未定义的属性‘data’"时

这就是我尝试添加新行的方式:

    var addNewHistoryRecord= function() {
        if (selectedLineIndex> -1) {
            var record= storeProjects.getAt(selectedLineIndex).data;
            var recordHistory= {
                idActivity: 0, //Server-side handles it
                idProject: record.idProject,
                nmProject: record.nmProject,
                dsDetails: dsDetailsField.getValue(),
                csStatus: csStatusField.getValue(),
                dtDate: dtDateField.getValue()
            }
            storeActivityProjectHistory.addRecord(recordHistory); // <--RIGHT HERE!
        }
    }

好吧,我对太长的帖子和愚蠢的变量名感到抱歉,我不得不把它们翻译成英语,因为我们在代码中使用我们的母语(这很糟糕)。我很确定storeActivityProjectHistory.loadData和storeActivityPProjectHistory.addRecord方法之间的关系是我的问题,但我只是不知道该怎么办。提前感谢,如果需要更多代码,我将发布更多的代码(例如,人们可能会注意到一些全局变量和我以前没有提到的最后一个javascript方法中的"storeProject",但我认为它实际上并不相关)。希望你们能帮忙!

编辑:按照指示,我已将store.addRecord更改为store.add,现在它在同一点返回以下错误:未捕获类型错误:对象#对象没有方法"join"有什么想法吗?

好的,我找到了答案。感谢Reimius让我不再懒惰,而是真正关注文档。泛型对象无法与store.add()一起使用,需要Ext.data.Record的子类实例。

为了做到这一点,以下是我遵循的简洁模板,并在不到10分钟的时间内解决了我的问题:http://docs.sencha.com/extjs/3.4.0/#/api/Ext.data.Record-static-method-创建

尽管文档本身说store.add接受Ext.data.Record[],但在我以正确的方式创建对象(即recordHistory)后,我并没有使用它storeActivityProjectHistory.add(recordHistory)做到了。