2013-04-10 59 views
1

我们有一个基于QT C++的完整桌面应用程序(mac & windows)。我们利用webkit来提供基于HTML和Javascript的用户界面。我们还通过JavaScript桥与C++进行交互。我做了相当多的工作,并将Ember.js作为MVC用于更多模块化UI。Ember.js QT w/Javascript桥梁

我的问题属于持久性的最佳方法。我应该坚持使用我们目前使用的Javascript对象,还是转换到Ember Data以进行持久化,并通过Ember Data(翻译层)中的函数进行读/写?

此外我们利用webkit,但我应该看到使用Node.js而不是strait html/js吗?

我不想做很大的改变,但我想这样做是正确的。有什么建议?

+1

你是否担心Qt的观点?在这里我不清楚Qt是如何实现的。你能提供更具体的东西吗?我使用Node.js,webkit和Qt编写了混合应用程序和瘦客户机。在Qt方面,您只需在加载的页面上将Qt对象暴露给JavaScript,使用Q_INVOKABLE调用C++函数,并根据需要利用信号和插槽来消除语言空白。你如何设想Ember.js改变这个设置?你仍然需要在Qt方面完成相同的步骤,对吧? – 2013-04-10 22:31:02

回答

1

从Ember方面来说,没有理由使用Ember Data,因为Ember在没有Ember Data的情况下工作良好。但是Ember的基础设施在很大程度上依赖于Ember.Observable提供的API,该API可用于Ember.Object的所有子类。同样,如果您使用Ember.ArrayEmber.MutableArray,则JavaScript阵列将支持更多的Ember功能,但除非您使用disable Ember.EXTEND_PROTOTYPES,否则这将自动发生。

所以一个非常合理的方法是将现有模型类移植到Ember.Object。除此之外,这需要使用getset来访问属性。如果你这样做,那么你的对象将成为头等Ember公民,并且你将可以访问Ember的所有精巧功能,包括自动视图更新和数据绑定。

这里是Ember.Object样子,以及它如何与Ember的其余部分结合在一起:

MyApp.Person = Ember.Object.extend({ 
    firstName: null, 
    lastName: null, 

    init: function() { 
    // You can put more initialization code here. 
    }, 

    // Compute fullName based on firstName and lastName. 
    // This will automatically propagate updates when 
    // firstName or lastName changes. 
    fullName: function() { 
    return this.get("firstName") + " " + this.get("lastName"); 
    }.property("firstName", "lastName") 
}); 

var person = MyApp.Person.create({ firstName: "Jane", lastName: "Doe" }) 

然后,在灰烬视图,你可以写这样的:

<p>{{person.fullName}}</p> 

...和每当firstNamelastName更改时,视图会自动更新。同样,你可以使用下面的代码编辑firstName

{{view Ember.TextField valueBinding="person.firstName"}} 

在这个例子中,文本字段的更改将自动传播到底层对象。 (虽然你可以变得聪明,并建立一个文本字段,只有当用户编辑完成后才传播更改。)

如果您需要将属性更新从Ember传递给QT,请参阅guide to building getters and setters with computed properties或使用observers。很大程度上取决于您如何通过JavaScript桥展示C++ API。但只要您可以以某种方式与Ember.Observable绑定,就可以完全访问Ember的所有功能。