2013-04-10 65 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的所有功能。