使用 REST API 的可编辑 jQuery 网格推荐

2024-01-12

首先,我已经读过这个问题“jQuery 网格建议 https://stackoverflow.com/questions/159025/jquery-grid-recommendations“但这并不能回答我的问题。

我有一个小带有 MongoDB 后端的 REST API https://gist.github.com/2779820 just :

获得所有装备:

GET /equipements HTTP/1.1
{{_id:key1, name:Test Document 1, plateforme:prod}, {_id:key2, name:Test Document 2, plateforme:prod}, ...}

使用钥匙获取装备:key1

GET /equipements/key1 HTTP/1.1
{"_id": "key1", "name": "Test Document 1", "plateforme": "prod"}

添加新设备

PUT /equipements HTTP/1.1  {"_id": "key8", "name": "Test Document 3", "plateforme": "prod"}
HTTP/1.0 200 OK

现在,我需要找到一种简单的方法来允许 lambda 用户添加/查看/删除设备。所以我认为带有类似 jQuery UI 的 Web 界面是最好的。我tried https://gist.github.com/2779912 with Sencha 休息代理 http://dev.sencha.com/deploy/ext-4.1.0-gpl/examples/restful/restful.html但我不知道 javascript 并且我无法适应该示例。

如何修复 REST 后端的 javascript?

AND/OR

您能推荐一个更简单的 Sencha Rest Proxy 替代方案吗?(与我的 REST 后端配合使用)

Answer : jqGrid

AND/OR

您会向我推荐什么 jQuery 网格?(与我的 REST 后端配合使用)

Answer : jqGrid

最后一个问题:为什么我的单元格无法通过双击进行编辑?

附录

服务器端(编辑:添加方法 POST)

#!/usr/bin/python
import json
import bottle
from bottle import static_file, route, run, request, abort, response
import simplejson
import pymongo
from pymongo import Connection
import datetime



class MongoEncoder(simplejson.JSONEncoder):
    def default(self, obj):
                # convert all iterables to lists
        if hasattr(obj, '__iter__'):
            return list(obj)
        # convert cursors to lists
        elif isinstance(obj, pymongo.cursor.Cursor):
            return list(obj)
        # convert ObjectId to string
        elif isinstance(obj, pymongo.objectid.ObjectId):
            return unicode(obj)
        # dereference DBRef
        elif isinstance(obj, pymongo.dbref.DBRef):
            return db.dereference(obj)
        # convert dates to strings
        elif isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) or isinstance(obj, datetime.time):
            return unicode(obj)
        return simplejson.JSONEncoder.default(self, obj)



connection = Connection('localhost', 27017)
db = connection.mydatabase

@route('/static/<filename:path>')
def send_static(filename):
    return static_file(filename, root='/home/igs/restlite/static')

@route('/')
def send_static():
    return static_file('index.html',root='/home/igs/restlite/static/')

@route('/equipements', method='PUT')
def put_equipement():
    data = request.body.readline()
    if not data:
        abort(400, 'No data received')
    entity = json.loads(data)
    if not entity.has_key('_id'):
        abort(400,'No _id specified')
    try:
        db['equipements'].save(entity)
    except ValidationError as ve:
        abort(400, str(ve))

@route('/equipements', method='POST')
def post_equipement():
    data = request.forms

    if not data:
        abort(400, 'No data received')
    entity = {}
    for k,v  in data.items():
        entity[k]=v

    if not entity.has_key('_id'):
        abort(400,'No _id specified')
    try:
        db['equipements'].save(entity)
    except ValidationError as ve:
        abort(400, str(ve))


@route('/equipements/:id', methodd='GET')
def get_equipement(id):
    entity = db['equipements'].find_one({'_id':id})
    if not entity:
        abort(404, 'No equipement with id %s' % id)
    return entity

@route('/equipements', methodd='GET')
def get_equipements():
    entity = db['equipements'].find({})
    if not entity:
        abort(404, 'No equipement')
    response.content_type = 'application/json'
    entries = [entry for entry in entity]
    return MongoEncoder().encode(entries)

run(host='0.0.0.0', port=80)

编辑:JQGrid:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Rest Proxy Example</title>
    <link rel="stylesheet" type="text/css" href="/static/css/ui.jqgrid.css" />
    <link rel="stylesheet" type="text/css" href="/static/css/jquery-ui-1.8.20.custom.css" />

    <script type="text/javascript" src="/static/js/jquery.js"></script>
    <script type="text/javascript" src="/static/js/jquery.jqGrid.min.js"></script>
    <script type="text/javascript" src="/static/js/grid.locale-fr.js"></script>
    <script type="text/javascript">
        jQuery(document).ready(function(){
            var lastsel;

jQuery("#list2").jqGrid({
    url:'equipements',
    datatype: "json",
    colNames:['Id','Name', 'Plateforme'],
    colModel:[
        {name:'_id',index:'_id', width:50, editable:true},
        {name:'name',index:'_id', width:300, editable:true},
        {name:'plateforme',index:'total', width:200,align:"right", editable:true},
    ],
    rowNum:30,
    rowList:[10,20,30],
    pager:'pager2',
    sortname: '_id',
    viewrecords: true,
    width: 600,
    height: "100%",
    sortorder: "desc",
    onSelectRow: function(_id){
        if(_id && _id!==lastsel){
            jQuery('#liste2').jqGrid('restoreRow',lastsel);
            jQuery('#liste2').jqGrid('editRow',_id,true);
            lastsel=_id;
        }
    },
    jsonReader: {
        repeatitems: false,
        id: "_id",
        root: function (obj) { return obj; },
        records: function (obj) { return obj.length; },
        page: function (obj) { return 1; },
        total: function (obj) { return 1; }
    },
    editurl:'equipements',
    caption:"Equipements"
});
jQuery("#list2").jqGrid('navGrid','#pager2',{edit:true,add:true,del:true});
});
    </script>
</head>
<body>
    <table id="list2"></table>
    <div id="pager2"></div>
    <br />

</body>
</html>

您可以使用 jqGrid 与 RESTfull 服务进行通信。 jqGrid支持树形编辑模式:单元格编辑、内联编辑和表单编辑。此外,内联编辑可以通过不同的方式初始化。例如,可以调用editRow http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#editrow里面的方法onSelectRow or ondblClickRow回调或使用navGrid http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator#definition添加“删除”按钮航海家 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator工具栏和内联导航 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#inlinenav添加“添加”和“编辑”按钮。另一种方法是使用格式化程序:“操作” http://www.trirand.com/jqgridwiki/doku.php?id=wiki:predefined_formatter#predefined_format_types在网格的一列中包含“编辑”按钮。你可以找到所有的方法官方 jqGrid 演示 http://trirand.com/blog/jqgrid/jqgrid.html。您可以在以下位置找到更多技术实施细节答案 https://stackoverflow.com/a/7365228/315935.

我个人认为了解在 Web 前端使用 RESTfull 服务的另一个重要方面很重要。问题在于标准 RESTfull API 没有任何用于数据排序、分页和过滤的标准接口。我尝试在下面解释这个问题。之后我希望一切都会清楚我的建议是使用具有附加参数并提供排序、分页和过滤功能的附加方法来扩展当前标准 RESTful API.

如果您有大量数据集,这个问题很容易理解。例如,在网格中一次显示 10000 行数据是没有意义的。用户无法在没有任何信息的情况下看到屏幕上的数据scolling or paging数据的。此外,由于同样的原因,实施它是有意义的sorting乃至过滤的数据。因此,一开始只显示一页数据并为用户提供一些对数据进行分页的界面会更加实用。在标准中pager http://www.trirand.com/jqgridwiki/doku.php?id=wiki:pagerjqGrid 看起来像

用户可以转到“下一页”、“最后一页”、“上一页”或“第一页”或选择页面大小:

additionally the user can specify the desired page by direct input of the new page and pressing of Enter:

以同样的方式,用户可以单击任何列的标题来按列对网格数据进行排序:

另一个非常重要的用户界面元素(从用户的角度来看很重要)可能是一些过滤界面,例如here http://www.trirand.com/jqgridwiki/doku.php?id=wiki:toolbar_searching例如或搜索界面如here http://www.trirand.com/jqgridwiki/doku.php?id=wiki:advanced_searching#calling_conventions.

我给你举了 jqGrid 的例子,但我发现这个问题很常见。我想强调的是,RESTful 服务没有为您提供用于数据排序、分页和过滤的标准接口.

如果使用 jqGrid,默认情况下将获取 RESTfull url额外的参数。它是:page, rows其中指定从服务请求的页码和页面大小,sidx and sord指定排序列和排序方向的参数_search and filters(最后一个是在格式 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:advanced_searching#options) 允许支持过滤。如果需要,可以使用以下命令重命名参数prmNames http://www.trirand.com/jqgridwiki/doku.php?id=wiki:optionsjqGrid 的选项。

我推荐你阅读答案 https://stackoverflow.com/a/776699/315935关于 URL 编码的问题。我认为这部分_search=false&rows=20&page=1&sidx=&sord=asc不属于资源,因此最好将信息发送为参数而不是 URL 的一部分。

我在回答中主要想表达的是,使用纯经典的 RESTfull API 不足以实现良好的用户界面。您必须使用用于分页、排序和过滤的附加参数来扩展界面,否则您将无法创建高性能且用户友好的 Web GUI。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 REST API 的可编辑 jQuery 网格推荐 的相关文章

  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • JQuery UI Selectable 插件:当 div 溢出时使滚动条不可选择

    我有一个 div 设置为overflow auto 该 div 的内容是可选择的 使用 jQuery UI 当 div 溢出并出现滚动条时 滚动条本身变为可选择状态 因此滚动效果不佳 在 FF Chrome 中 我可以滚动 div 但我得到
  • 自动建议 php 的 ajax

    我有一个 html 表单 php 脚本和 jquery 我需要一个 ajax 代码来从我的 php 脚本中进行自动建议 以下是代码 表单 html
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 在 Angular 中让多个调用等待同一个 Promise

    我在一个页面上有多个使用相同服务的控制器 为了举例 我们将服务称为 USER 第一次调用 USER getUser 时 它会发出 http 请求来获取有关用户的数据 调用完成后 它将数据存储在 USER data 中 如果再次调用 USER
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 当 AngularJS 控制器加载时运行一次

    我有一些事情只需要在控制器加载时完成一次 最好的方法是什么 我读过一些有关 运行块 的内容 但我不太明白它是如何工作的 一些伪代码 when app resolove some stuff load a view controllerA C
  • 如何使用 SnakeYaml 加载自定义对象列表

    我一直在尝试将以下 yaml 反序列化为List
  • Jenkins 蓝海:Maven 看不到 Java

    即使路径存在 我也收到错误 var jenkins home tools hudson model JDK jdk8 bin java 未找到 edi debatcher master LNI22Y2C5V3VECCBCFPVB3ZUWJJ
  • 如何检查双精度数是否可以放入浮点数而不转换为无穷大

    是否有一种标准方法来检查 64 位浮点数是否可以转换为 32 位浮点数而不转换为 Infinity 我知道事后可以检查 Inf Convert ToSingle 不会这样做 为了测试是否double value d将转换为float在不产生
  • 如何强制 PhpMailer 5.2 使用 TLS 1.2

    最近我使用的第三方电子邮件服务提供商发生了变化 他们禁用了对 TLS 1 0 和 TLS 1 1 的支持 我为仍然使用 php 5 3 和 phpmailer 5 2 的古老系统提供支持 我的测试表明 TLS 1 2 已启用 但是 禁用 T
  • 使用带有自定义键的 HashMap

    快速问题 如果我想使用HashMap以自定义类为键 must我覆盖hashCode功能 如果我不重写该函数 它将如何工作 如果您不覆盖 hashCode AND equals 您将获得默认行为 即每个对象都是不同的 无论其内容如何
  • WF4 InstancePersistenceCommand 中断

    我有一个 Windows 服务 正在运行工作流程 工作流程是从数据库加载的 XAML 用户可以使用重新托管的设计器定义自己的工作流程 它配置有一个 SQLWorkflowInstanceStore 实例 以便在空闲时保留工作流 它基本上源自
  • 有什么方法可以判断任意 .docx 文件是否采用 Strict Office Open XML 格式与过渡格式? (ECMA-376)

    我在网上搜索过 没有找到任何程序或工具可以区分那些编码为严格 ECMA 376 和非严格 ECMA 376 的 docx 文件 对于 xlsx 文件也是如此 大多数讨论都集中在给定应用程序支持哪些格式 例如LibreOffice 但不知道如
  • 一起录制视频和屏幕并用 Javascript 覆盖

    我想在网络摄像头旁边记录用户的屏幕并将结果显示为叠加层 如下所示 我假设在录制时我可以在两个单独的视频元素中显示多个流并用 CSS 覆盖它们 然而 我该如何save结果是两个视频的叠加 这可以在纯 JS 中实现 如下所示 通过 getUse
  • 为什么建议在 .NET 中使用反射?

    使用它绝对是一个好的做法吗 项目中有哪些可能的情况需要反思 反射的主要价值在于它可用于检查程序集 类型和成员 它是一个非常强大的工具 用于确定未知程序集或对象的内容 并且可用于多种情况 Reflection 的反对者会说它很慢 与静态代码执
  • 延迟函数不恢复

    所以 我一直在摆弄go 我发现下面的函数恢复成功 package main import fmt func a defer func if r recover r nil fmt Println Recovered r n int 5 7
  • 如何修复 Laravel 应用程序找不到 nginx 404?

    我所有的路线都得到了404未找到 如果我访问 我可以打开 Laravel 页面localhost mylaravel 但如果我访问localhost mylaravel login 我得到 404 未找到页面 如果我更改 home 上的回家
  • Login-AzureRmAccount 返回订阅,但 Get-AzureSubscription 返回空

    我能够成功登录Login AzureRmAccount 我还可以在 Login AzureRmAccount 的返回值中看到我的订阅 但登录后 如果我输入Get AzureSubscription它返回空 找到下面的截图 嗯 你需要使用Ge
  • 如何向android studio添加外部依赖(jar文件)?

    我正在尝试将外部库 httpmime 4 0 sources jar 添加到 android 项目中 因为 android studio 弹出如下错误 error 包 org apache http entity mime 不存在 erro
  • Microsoft UI 自动化的 Python 绑定? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 Microsoft UI 自动化的 Python 绑定吗 http msdn microso
  • Flutter:如何避免在现有路由上推送相同的路由

    我有带有底部导航栏的视图 当您按下导航栏项目时 一条新路线将被推入视图中 final navigatorKey GlobalKey
  • Azure B2C:检查本地帐户创建期间是否存在另一个声明

    除了通常根据所使用的电子邮件当前是否存在创建帐户之外 我想知道如何检查 Azure Active Directory 中是否不存在另一个声明值 例如 对于我们的应用程序 创建帐户的任何人都必须提供组织名称 一旦他们注册 他们就是其组织群组的
  • 如何使用 Selenium 和 Python 更改用户代理

    我在使用 selenium 更改 Python 中的 Web 驱动程序用户代理时遇到错误 这是我的代码 import requests import json from selenium import webdriver from sele
  • Vector3 不可序列化 Unity3D

    好吧 我按照 Unity3D 数据持久化教程进行操作 一切都很顺利 直到我尝试保存 Vector3 类型的数据 本教程仅展示如何保存 int 和 string 当我使用函数 Save 时 控制台向我显示says SerializationE
  • 使用 REST API 的可编辑 jQuery 网格推荐

    首先 我已经读过这个问题 jQuery 网格建议 https stackoverflow com questions 159025 jquery grid recommendations 但这并不能回答我的问题 我有一个小带有 MongoD