1

我正在使用 DOJO jsonreststore 编写一个 PHP REST API,我知道很多已经在那里,但主要是为了更好地理解这个概念。为了检查结果,我将商店连接到数据网格,除了两件事之外的一切都在工作。

如果我从商店中删除一个项目,它会在数据网格中消失,但如果我在 store._index 中查看 firebug,则删除的项目仍然存在。这可能是因为该视图未更新?

其次是当我发布一个新项目并且后端返回新创建的项目 + 生成的 id 时。数据网格仅在没有我新生成的 ID 的情况下更新为新行。如果我在 store._index 中查看 firebug,我会看到一个带有我新创建的 ID 的项目,但仍然有一个带有客户端生成 ID 的项目。数据网格正在显示没有 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);
}
4

2 回答 2

0

打错了:s reststore 现在按预期运行。

尽管如此,商店维护已删除/创建的项目的本地副本仍然很奇怪,也许是为了恢复。无论如何,它对我有用,所以我猜案子已经结案了。

于 2012-09-30T14:33:02.613 回答
0

尝试使用remove(id)andadd(object, options)代替。JsonRest 存储遵循CRUD模式,它是C reate R read 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 计算为顺序主 ID,并简单地将 1 添加到已知的最高身份。

否则,您将不得不读取add操作的响应(在 Deferred 回调中)并设置新创建项目的 ID。

于 2012-09-29T21:04:58.073 回答