我正在使用DOJO jsonreststore编写一个PHP REST API,我知道很多已经在那里,但主要是为了更好地理解这个概念。为了检查结果,我将商店连接到数据网格,除了两件事之外的所有东西都在工作。
如果我从商店中删除了一个项目,它会在datagrid中消失,但如果我在store._index中查看firebug,则删除的项目仍然存在。这可能是因为该视图未更新?
其次是当我发布新项目并且后端返回新创建的项目+生成的id时。仅在没有新生成的id的情况下使用新行更新数据网格。如果我在store._index中查看firebug,我会看到一个带有我新创建的ID的项目,但仍然有一个客户端生成ID的项目。 datagrid显示没有id生成服务器端的对象。
但坚持到这里,有什么想法吗?
下面我发布了一些代码:
添加项目:
dojo.connect(dijit.byId("addLocation"), "onClick", function() {
var Location = locationStore.getConstructor();
var location = new Location();
location.name = "TESTLOC"
location.description = "TESTDESC"
location.company = "1"
location.companyname = "TEST"
locationStore.save();
});
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$putvars = json_decode(file_get_contents("php://input"));
$location = new Location();
$location->setCompany($putvars->company);
$location->setCompanyName($putvars->companyname);
$location->setDescription($putvars->description);
$location->setId(14);
$location->setName($putvars->name);
header("HTTP/1.0 201 Created", true, 201);
header("Location: http://localhost/resttest/location/" . 14);
echo $location->toJSON();
}
删除项目:
dojo.connect(dijit.byId("deleteLocation"), "onClick", function() {
var location = locationGrid.getItem(0);
locationStore.deleteItem(location);
locationStore.save();
});
if ($_SERVER['REQUEST_METHOD'] == "DELETE") {
$uri = explode("/",$_SERVER['REQUEST_URI']);
$locationId = $uri[count($uri)-1];
header("HTTP/1.0 204 OK", true, 204);
}
答案 0 :(得分:0)
尝试使用remove(id)
和add(object, options)
代替。 JsonRest商店遵循CRUD
模式,这是 C reate R ead U pdate D 的缩写elete。但是,函数的映射不同,add()
,get()
,delete()
(yay)和put()
(具有覆盖标记)。
尝试一些不同的方法。
var id = getIdentity(locationGrid.getItem(0))
locationStore.delete(id);
var location = {
name = "TESTLOC",
description = "TESTDESC",
company = "1",
companyname = "TEST"
}
locationStore.add(location).then(
function(response) {
}
});
我记得,如果没有提供客户端,则会创建一个通用ID。考虑将uniq ID计算为顺序主数据,只需将1添加到最高已知身份。
否则你必须阅读add
操作的响应(在Deferred回调中)并设置新创建项目的ID。
答案 1 :(得分:0)
写了一个错字:s reststore现在表现得如预期的那样。
然而,仍然很奇怪的是,商店维护了为了还原而删除/创建的项目的本地副本。无论如何它对我有用,所以我想案件已经结束了。