私は午後中ずっとこの問題に苦しんでいましたが、実行可能な解決策をオンラインで見つけることができませんでした。私は自分の問題について徹底的に説明するために最善を尽くします (つまり、ここにある私のコードの一部は単純化された例であり、あちこちでストーリーの一部を説明します)。より良い理解)。まず、私は EXT.NET MVC モデルを使用し、マークアップを多用しています。だから、ここに私の店(実際のコード)があります:
<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>
ここで、いくつかの説明が必要です。アクティビティが作成されるたびに、ユーザーは 1 つまたは複数のプロジェクトをそれにリンクする可能性があります。また、この LINK のステータスを変更して、アクティビティ内でプロジェクトがアクティブか非アクティブかを示すこともできます。このリンクの変更は履歴に保存する必要があります。これは、上記のグリッドとストアがサポートを提供するものです。
このリンクが作成されるときはいつでも、アクティブであり、デフォルトの詳細 (「レコードが作成されました」) を持っている必要があります。これはデフォルトの動作であり、多くのストアド プロシージャを使用して DB を処理するため、新しいリンクが作成されるたびに、これらの値を 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.Original は、現在読み込まれているアクティビティにリンクされたすべてのプロジェクトのすべての履歴情報を保持します。ここでは、それらのプロジェクトの 1 つだけに関連する情報を選択して、ストアに読み込みます。
そして、グランド フィナーレでは、このリンクのステータスを変更しようとするたびに (既に読み込まれている現在の行の下に、グリッドに 2 行目を追加する必要があります)、恐ろしい "Uncaught TypeError: Cannot read property" を受け取ったときです。未定義のデータ」
これは私が新しい行を追加しようとする方法です:
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 メソッドと storeActivityProjectHistory.addRecord メソッドの間の関係が私の問題であることは確かですが、どうすればよいかわかりません。事前に感謝します。さらにコードが必要な場合は、さらにコードを投稿します (たとえば、前に言及していなかった最後の JavaScript メソッドのいくつかのグローバル変数と「storeProject」に気付くかもしれませんが、私はそうは思いませんそれは実際に関連しています)。皆さんが助けてくれることを願っています!
編集: 指示に従って、store.addRecord を store.add に変更したところ、同じポイントで次のエラーが返されるようになりました: Uncaught TypeError: Object #Object has no method 'join' 何かアイデアはありますか?