У нас есть полное настольное приложение, основанное на QT C ++ (Mac & окна). Мы используем webkit для обслуживания пользовательского интерфейса, основанного на HTML и Javascript. Мы также взаимодействуем с C ++ через мост javascript. Я делаю довольно много и включаю Ember.js в качестве MVC для гораздо более модульного пользовательского интерфейса.
Мой вопрос касается лучшего метода для настойчивости. Должен ли я придерживаться объектов Javascript, которые мы используем в настоящее время, или перейти на Ember Data для сохранения и чтения / записи через функцию в Ember Data (слой перевода)?
Также мы используем webkit, но стоит ли мне вместо этого использовать Node.js, а не прямые html / js?
Я бы не хотел делать кардинальные изменения, но я хочу сделать это правильно. Любой совет?
Со стороны Ember нет смысла использовать Ember Data, потому что Ember прекрасно работает без него. Но инфраструктура Ember сильно зависит от API, предоставляемого Ember.Observable
, который доступен для всех подклассов Ember.Object
. Аналогично, массивы JavaScript будут поддерживать больше функций Ember, если вы используете Ember.Array
а также Ember.MutableArray
, хотя это произойдет автоматически, если вы запрещать Ember.EXTEND_PROTOTYPES
.
Таким образом, один очень разумный подход заключается в переносе существующих классов моделей на Ember.Object
, Это потребует, среди прочего, использования get
а также set
чтобы получить доступ к свойствам. Если вы сделаете это, то ваши объекты будут первоклассными гражданами 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" })
Затем в представлении Ember вы могли бы написать что-то вроде:
<p>{{person.fullName}}</p>
… и представление будет автоматически обновляться всякий раз, когда firstName
или же lastName
изменилось. Точно так же вы можете редактировать firstName
используя следующий код:
{{view Ember.TextField valueBinding="person.firstName"}}
В этом примере изменения в текстовом поле будут автоматически распространяться обратно на базовый объект. (Хотя вы можете стать умным и построить текстовое поле, которое распространяет изменения, только когда пользователь завершит редактирование.)
Если вам нужно передать обновления свойств из Ember в QT, см. руководство по созданию геттеров и сеттеров с вычисленными свойствами или использовать наблюдателей. Многое зависит от того, как именно вы выставляете свои C ++ API через мост JavaScript. Но пока вы можете связать Ember.Observable
так или иначе, у вас будет полный доступ ко всем функциям Ember.
Других решений пока нет …