我目前基于 XML 和 Javascript 实现我的用户界面。我写了很多包装类,到目前为止一切正常。只有一件事让我烦恼。我无法从我的一个函数的参数创建持久对象。说我有以下功能:
void UIManager::registerJSObject(JSObjectPtr objPtr) {
使用我的包装器注册到 Javascript 的 JSObject(包装 v8::Handle)指向本地函数参数,因此在函数之后它被删除。现在显然那不是我想要的。
我的第一种方法是向 JSObject 类添加一个 makePersistent 方法,如下所示:
void JSObject::makePersistent() {
v8::Persistent<v8::Object> newObj = v8::Persistent<v8::Object>::New(mObject);
mObject = newObj;
}
可悲的是它没有工作,该对象仍然被垃圾收集。所以我认为当我在那里这样做时可能为时已晚,并且由于某种原因从回调的 Arguments 参数中获取它时已经必须转换它并且我将包装器更改为此(仅用于测试):
template<uint32 size, typename T, typename... FullArgs, typename... Args>
Res expand(const v8::Arguments& args, Args... curArgs) {
return expand<size + 1, FullArgs...>(args, curArgs..., ObjectWrap::unwrap<T>(v8::Persistent<v8::Value>::New(args[size])));
}
可悲的是,那也不起作用。我无法获得在 javascript 中分配的对象的持久句柄。我在谈论那个代码:
var frame = {
xmlTemplate: "testXml.xml",
onTemplateLoaded: function () {
this.frame1.button1.Caption = "Test";
},
buttonClicked: function(button) {
button.Caption = "Clicked";
}
};
UIMgr.loadUIElement(frame);
并且 id 喜欢调用 buttonClicked 函数或设置一些字段,不仅在 UI.load 函数中,而且在以后。
有谁知道我是否遗漏了什么或者这是一个错误?
问候穆佩