Javascript 在Kineticjs中成功调用ajax后设置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

我正在MVC应用程序中使用KineticJS

为了从数据库中检索数据,我在API控制器中对web服务进行了一些ajax调用。有一个API返回一个id,我想在成功时将其分配给当前的
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=dataajax调用成功后,仍然会出现相同的错误。看起来这条指令并没有什么作用。在调用
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);