【问题标题】:Jsonreststore posting and deletingJsonreststore 发布和删除
【发布时间】:2012-09-28 17:40:54
【问题描述】:

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

【问题讨论】:

    标签: php rest dojo


    【解决方案1】:

    尝试改用remove(id)add(object, options)。 JsonRest 存储遵循CRUD 模式,它是 C reate RU 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,则会创建一个通用 ID。考虑将 uniq ID 计算为顺序主 ID,并简单地将 1 添加到已知的最高身份。

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

    【讨论】:

    • 感谢您的回复!如果我查看其余商店和超类服务商店的 DOJO API 文档,我看不到您提到的功能(添加、获取、删除和放置)。尽管如此,我尝试了它们,但我也收到一个错误,表明这些功能不存在。此外,在不同的在线资源中,如果创建或更新了一个项目,您可以从您的服务中返回该特定项目,以便在生成 ID 的情况下使后端丰富成为可能,因为我不希望我的客户为我创建一个 id,所以这有点令人困惑。您使用什么版本的 DOJO?我在 1.8
    • api 参考的结构不是很好,事实上我从来没有找到我想要的东西。如果有疑问,请自定义检查源文件(c 的注释非压缩版本) .如果文档没有帮助,请在此处找到 dojo/store/JsonRestdojotoolkit.org/reference-guide/1.8/dojo/store/JsonRest.html
    • 刚刚发现我们的商店之间的区别:) 我仍在使用(在 1.8 中已弃用)dojox.data.JsonRestStore,您使用 dojo.store.JsonRest 是正确的,再次感谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 2013-01-26
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多