Javascript 在Kineticjs中成功调用ajax后设置id属性
我正在MVC应用程序中使用KineticJS 为了从数据库中检索数据,我在API控制器中对web服务进行了一些ajax调用。有一个API返回一个id,我想在成功时将其分配给当前的Javascript 在Kineticjs中成功调用ajax后设置id属性,javascript,ajax,asp.net-mvc,kineticjs,Javascript,Ajax,Asp.net Mvc,Kineticjs,我正在MVC应用程序中使用KineticJS 为了从数据库中检索数据,我在API控制器中对web服务进行了一些ajax调用。有一个API返回一个id,我想在成功时将其分配给当前的Kinetic.Groupid属性 拖放后,将出现一个弹出窗口PopUpAddRoom(floorrid),并调用AddRoom函数 我的代码: function AddRoom(FloorId, RoomName, TypeID) { $.ajax({ beforeSend: function
Kinetic.Group
id属性
拖放后,将出现一个弹出窗口PopUpAddRoom(floorrid)
,并调用AddRoom函数
我的代码:
function AddRoom(FloorId, RoomName, TypeID) {
$.ajax({
beforeSend: function (xhr) { // verify session },
url: "/api/someurl", //url for adding the room, that returns room's id
type: "Post",
dataType: 'json',
success: function (data) {
//data is the room id
var r = rightLayer.find("#" + data)[0];
console.log(r.getType()); // here I don't even get the type, I get "Object []"
var rec = r.find("Rect"); //rec is a rectangle inside the group
rec.setId(data);
rightLayer.draw();
}
});
}
问题是r=rightLayer.find(“#”+data)[0]代码>为空。它返回undefined
当我调用console.log(数据)时
要查看数据内容是否为空,它将返回正确的id
我初始化了id,如下所示:id:“
,并希望它在从数据库获取数据时进行更改。但这失败了。这个代码有什么问题吗
编辑:
在弄明白id:'
确实是一个愚蠢的想法之后(在markE的帮助下),我尝试将id初始化为一个空变量ident,该变量从web服务获取其值(当成功添加新实例时,此ws会增加id)
但是问题并不是来自r=rightLayer.find(“#”+data)[0]代码>。这是将id分配给节点(指令的位置)的事实
然后我添加了这一行:ident=data代码>ajax调用成功后,仍然会出现相同的错误。看起来这条指令并没有什么作用。在调用PopUpAddRoom
函数之后,ident的值没有变化。根据KineticJS文档:
find(selector) --> return a Kinetic.Collection of nodes that match the selector
因此,如果find
返回一个集合,为了获得该层,我认为如下所示:
var r = rightLayer.find("#" + data)[0];
考虑到KineticJS形状中的id
是唯一的,应该可以工作。如果将所需节点的id
初始化为空字符串:
id:''
然后此.find
将永远不会检索到所需的节点:
var r = rightLayer.find("#" + data);
相反,你可以这样做:
...
id:'replaceable1'
...
var r = rightLayer.find("#replaceable1")[0];
var rec = r.find("Rect")[0];
// change the id of both r and rec
r.setId(data);
rec.setId(data);
请注意.find总是返回一个集合(像一个奇特的数组),所以要获取对该数组中元素的引用,必须执行[n]。例如myLayer.find(something)[0]。逻辑上是的,我尝试添加[0]选择器,但我得到了以下错误:TypeError:r在这一行中未定义var rec=r.find(“Rect”)代码>如果我只有一个节点,则此操作有效。在我的例子中,我克隆了节点,每次id增加时,每个节点都有一个不同的id代码>在创建新节点(克隆)时递增,然后初始化id:ident
。我仍然得到错误r是未定义的:-(在不了解更多代码的情况下,我只能说,使用id:ident++
的ident
计数器将正确地为每个克隆提供一个唯一的id,您可以使用stage.find(“#”+您的identvalue之一)[0]。因此,您在问题代码之外的编码中有一个错误。您可以使用stage.find而不是rightLayer.find(以防节点实际上不在rightLayer上)。此外,请仔细检查您在分配标识后跟踪标识的方法--可能会出现问题。这是我所掌握的信息的范围。祝您的项目好运!错误来自将标识分配给新标识(数据)的实际位置
...
id:'replaceable1'
...
var r = rightLayer.find("#replaceable1")[0];
var rec = r.find("Rect")[0];
// change the id of both r and rec
r.setId(data);
rec.setId(data);