我们有一个基于QT C++(mac和Windows)的完整桌面应用程序。我们利用webkit来提供基于HTML和Javascript的UI。我们还通过JavaScript桥与C++进行了交互。我正在做大量工作,并将Ember.js作为MVC并入了更多模块化的UI。
我的问题是关于持久性的最佳方法。我应该坚持使用当前使用的Javascript对象,还是过渡到Ember Data以获得持久性,并通过Ember Data(转换层)中的函数进行读写?
我们也利用webkit,但是我应该看看使用Node.js而不是strait html / js吗?
我不想做大的改变,但是我想做正确的事。有什么建议吗?
最佳答案
从Ember角度来看,没有理由使用Ember Data,因为没有它,Ember可以正常工作。但是Ember的基础结构严重依赖于 Ember.Observable
提供的API,该API可用于 Ember.Object
的所有子类。同样,如果使用 Ember.Array
和 Ember.MutableArray
,则JavaScript数组将支持更多的Ember功能,尽管除非您使用disable Ember.EXTEND_PROTOTYPES
,否则这将自动发生。
因此,一种非常合理的方法是将您现有的模型类移植到Ember.Object
。除其他外,这将需要使用get
和set
访问属性。如果执行此操作,则您的对象将是一流的Ember公民,您将可以使用Ember的所有功能,包括自动 View 更新和数据绑定(bind)。
这是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" })
然后,在Ember View 中,您可以编写如下内容:
<p>{{person.fullName}}</p>
…只要
firstName
或lastName
更改, View 就会自动更新。同样,您可以使用以下代码编辑firstName
:{{view Ember.TextField valueBinding="person.firstName"}}
在此示例中,对文本字段的更改将自动传播回基础对象。 (尽管您可以变得聪明,并建立一个仅在用户完成编辑后才传播更改的文本字段。)
如果您需要将属性更新从Ember传递到QT,请参阅guide to building getters and setters with computed properties或使用observers。很大程度上取决于您如何通过JavaScript桥公开C++ API。但是,只要您能以某种方式绑定(bind)到
Ember.Observable
,您就可以完全使用Ember的所有功能。