1

私は DOJO jsonreststore を使用して PHP REST API を作成しています。すでに多くの API が出回っていることは知っていますが、主に概念をよく理解するためのものです。結果を確認するために、ストアをデータグリッドに接続しましたが、2 つを除いてすべてが機能しています。

ストアから項目を削除すると、データグリッドで消えますが、store._index で firebug を調べると、削除された項目がまだ残っています。これは、そのビューが更新されていないためでしょうか?

2 つ目は、新しいアイテムを投稿すると、バックエンドが新しく作成されたアイテム + 生成された 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

タイプミスがありました。レストストアが期待どおりに動作するようになりました。

それにもかかわらず、おそらく元に戻すために削除/作成されたアイテムのローカルコピーをストアが保持していることは依然として奇妙です. とにかくそれは私のために働いているので、ケースは閉じられたと思います。

于 2012-09-30T14:33:02.613 に答える
0

代わりにremove(id)andを使用してみてください。JsonRestadd(object, options)ストアは、 C reate Read Update D eleteCRUDの略であるパターンに従います。ただし、関数は異なる方法でマッピングされます。add()get()delete()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 をシーケンシャル プライマリとして計算し、最も高い既知の ID に 1 を追加するだけです。

それ以外の場合は、add操作からの応答を (Deferred コールバックで) 読み取り、新しく作成されたアイテムの ID を設定する必要があります。

于 2012-09-29T21:04:58.073 に答える