Jsonreststore发布和删除

时间:2012-09-28 17:40:55

标签: php rest dojo

我正在使用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);
}

2 个答案:

答案 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现在表现得如预期的那样。

然而,仍然很奇怪的是,商店维护了为了还原而删除/创建的项目的本地副本。无论如何它对我有用,所以我想案件已经结束了。