0

我目前基于 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 函数中,而且在以后。

有谁知道我是否遗漏了什么或者这是一个错误?

问候穆佩

4

1 回答 1

0

好的,我找到了解决方案。我已经在正确的轨道上,持久句柄的创建必须在原始对象上完成,所以我修改了我的扩展成员函数,第二次重载,特别是对于应该获取 JSObject 的参数。

和之前看到的差不多:

    template<uint32 size, typename T, typename... FullArgs, typename... Args>
    typename std::enable_if<std::is_same<T, JSObjectPtr>::value, Res>::type expand(const v8::Arguments& args, Args... curArgs) {
        return expand<size + 1, FullArgs...>(args, curArgs..., ObjectWrap::unwrap<T>(v8::Persistent<v8::Value>::New(args[size])));
    }

JSObjectPtr 的 ObjectWrap::unwrap 中有有趣的部分:

    template<typename T>
    static typename std::enable_if<std::is_same<T, JSObjectPtr>::value, JSObjectPtr>::type unwrap(v8::Persistent<v8::Value> val) {
        v8::Persistent<v8::Object> objh = v8::Persistent<v8::Object>::Cast(val);

        return std::make_shared<JSObject>(objh);
    }

它必须作为v8 ::Persistent 传递给函数,否则它将不起作用。

JSObject 有一个用于持久句柄的构造函数,并将其转换为弱引用,当没有人再使用 JSObject 时(并且实际上必须收集它时),该弱引用会被调用。

于 2013-03-26T00:04:52.213 回答