ExtJS 4: Enregistrement d'enregistrement d'enregistrement, modifiez le formulaire au serveur et à la mise à jour de la grille de magasin
Ci-dessous, j'ai une grille des dossiers du projet. Je suis le chargement du projet de la liste d'enregistrement via un service web asmx. Je suis de retour d'une Liste d'objet .NET via un json proxy pour mon projet de liste de magasin. Chaque objet du Projet se lie à mon Projet modèle. En Double cliquant sur une ligne dans la liste des projets de la grille lance le Projet de formulaire de modification.
Je suis aux prises avec l'économie d'une modification d'un enregistrement dans mon menu contextuel forme (widget.projectedit) après avoir cliqué sur le bouton "Enregistrer". Je ne suis pas sûr de savoir si je dois envoyer ma mise à jour pour le projet de stocker et de synchroniser mon magasin avec mon proxy, ou la mise en place d'un magasin séparé et d'un proxy pour un Projet unique d'enregistrement, et puis il suffit de rafraîchir mon projet d'enregistrer et d'afficher.
"editProject" est appelé pour le lancement de ma forme. Je veux "updateProject" pour mettre à jour mon disque, mais je n'ai pas de délégué pour encore (je ne suis pas en invoquant/l'appeler dans le code ci-dessous).
Questions spécifiques:
Comment dois-je appeler le "updateProject" fonction?
Comment puis-je mettre à jour ma liste de projet de grille de magasin?
Les modifications de code dont j'ai besoin? (Je peux comprendre à quel est le code à mettre dans le asmx service.. j'ai juste besoin d'aide avec le code JavaScript)
ProjectList.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ProjectList.ascx.cs" Inherits="Web.Controls.ProjectList.ProjectList" %>
<div id="example-grid"></div>
<asp:ScriptManager ID="PageScriptManager" runat="server">
<Services>
<asp:ServiceReference Path="~/WebService1.asmx" InlineScript="false" />
</Services>
<Scripts>
<asp:ScriptReference Path="~/ext-4/ext-all-debug.js" />
<asp:ScriptReference Path="~/Controls/ProjectList/ProjectList.js" />
<asp:ScriptReference Path="~/Controls/ProjectList/Proxy.js" />
</Scripts>
</asp:ScriptManager>
<script type="text/javascript">
Ext.require([
'Ext.grid.*',
'Ext.data.*',
'Ext.panel.*',
'Ext.layout.container.Border'
]);
Ext.namespace('EXT');
Ext.define('Project', {
extend: 'Ext.data.Model',
fields: [
'project_id',
'project_name',
'project_number'
]
});
Ext.define('ProjectEdit', {
extend: 'Ext.window.Window',
alias: 'widget.projectedit',
title: 'Edit Project',
layout: 'fit',
autoShow: true,
initComponent: function () {
this.items = [
{
xtype: 'form',
items: [
{
xtype: 'textfield',
name: 'project_id',
fieldLabel: 'Project ID'
},
{
xtype: 'textfield',
name: 'project_number',
fieldLabel: 'Project Number'
},
{
xtype: 'textfield',
name: 'project_name',
fieldLabel: 'Project Name'
}
]
}
];
this.buttons = [
{
text: 'Save',
action: 'save'
},
{
text: 'Cancel',
scope: this,
handler: this.close
}
];
this.callParent(arguments);
}
});
var store = new Ext.data.Store(
{
proxy: new Ext.ux.AspWebAjaxProxy({
url: 'http://localhost/WebService1.asmx/GetProjects',
actionMethods: {
create: 'POST',
destroy: 'DELETE',
read: 'POST',
update: 'POST'
},
extraParams: {
myTest: 'a',
bar: 'foo'
},
reader: {
type: 'json',
model: 'Project',
root: 'd'
},
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
});
Ext.define('ProjectGrid', {
extend: 'Ext.grid.Panel',
initComponent: function () {
var me = this;
Ext.applyIf(me, {
store: store,
columns: [
{ text: 'Project ID', width: 180, dataIndex: 'project_id', sortable: true },
{ text: 'Project Number', width: 180, dataIndex: 'project_number', sortable: true },
{ text: 'Project Name', width: 180, dataIndex: 'project_name', sortable: true }
],
listeners: {
itemdblclick: this.editProject
}
});
me.callParent(arguments);
},
editProject: function (grid, record) {
var view = Ext.widget('projectedit');
view.down('form').loadRecord(record);
},
updateProject: function (button) {
var win = button.up('window'),
form = win.down('form'),
record = form.getRecord(),
values = form.getValues();
record.set(values);
win.close();
//synchronize the store after editing the record
this.getProjectStore().sync();
}
});
//create the grid
var grid = Ext.create('ProjectGrid', {
title: 'Project List',
renderTo: 'example-grid',
width: 540,
height: 200
});
store.load();
</script>
Service Web:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Xml;
using System.Data;
using System.Web.Script.Services;
using System.IO;
using System.Text;
namespace Web
{
///<summary>
///Summary description for WebService1
///</summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
//To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
public class Project
{
public string project_id;
public string project_number;
public string project_name;
}
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json,
UseHttpGet = false, XmlSerializeString = false)]
public List<Project> GetProjects(string myTest, string bar)
{
var list = new List<Project>(new[] {
new Project() {project_id="1", project_name="project 1", project_number="001"},
new Project() {project_id="2", project_name= "project 2", project_number= "002" },
new Project() {project_id="3", project_name= "project 3", project_number= "003" }
});
return list;
}
}
}
OriginalL'auteur MacGyver | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
Vous devez décider:
: Charger et enregistrer un modèle dans la fenêtre de l'éditeur de manière indépendante.
exemple de code: http://jsfiddle.net/el_chief/rUaV3/4/
(au-dessus de l'ajax d'économie est faux, de sorte que vous ne verrez pas de mise à jour sur la grille).
DEUX: passer dans le modèle de l'appelant, et enregistrer le modèle en l'appelant.
exemple de code: http://jsfiddle.net/el_chief/5jjBS/4/
ON est un peu plus lent, mais tout est indépendant et vous pouvez les tester de manière indépendante.-
Aussi, si vous passez dans le modèle de l'appelant et de l'utilisateur apporte des modifications et ferme la fenêtre enfant, ces changements PEUVENT apparaître dans l'appelant (selon la façon dont vous faites votre vue/modèle de synchronisation).
Aussi, souvent, vous voulez seulement de prendre un peu de champs à afficher sur les grilles, mais afficher tous les champs sur un article-afficher le formulaire. Dans ce cas, vous avez besoin de l'option.
De toute façon, vous devez passer dans une fonction de rappel à la fenêtre enfant, qu'il appelle quand il est "fait". De cette façon, vous pouvez récupérer toutes les données nécessaires à partir de la fenêtre enfant, et de le fermer en cas de besoin.
Vous n'avez pas besoin d'un singulier store de la fenêtre. Vous devriez mettre votre procuration sur vos modèles (la banque utilise ses modèles proxy et vous pouvez toujours le remplacer)
Un facteur clé de l'économie, c'est que vous avez besoin de retourner certaines données, généralement un dossier complet comme:
Ok, mais vous devez promettre de faire quelque chose de gentil pour un étranger 🙂 Code de la route...
OriginalL'auteur Neil McGuigan