Javascript Ember DS.model公开的数据属性

Javascript Ember DS.model公开的数据属性,javascript,ember.js,Javascript,Ember.js,我正在尝试实现,并取得了一些轻微的成功,我认为我的痛苦部分是由于一些数据属性没有公开 扩展Ember.Object时,如下所示: App.Cat = Ember.Object.extend({ name: null, cuteness: null }) 在我的Chrome控制台中创建的对象看起来像这样: __ecBitwiseColour: 3 __ecBitwiseCountry: 2 __ember1389472009050: undefined __ember1389472009

我正在尝试实现,并取得了一些轻微的成功,我认为我的痛苦部分是由于一些数据属性没有公开

扩展
Ember.Object
时,如下所示:

App.Cat = Ember.Object.extend({
  name: null,
  cuteness: null
})
在我的Chrome控制台中创建的对象看起来像这样:

__ecBitwiseColour: 3
__ecBitwiseCountry: 2
__ember1389472009050: undefined
__ember1389472009050_meta: Meta
_super: undefined
cuteness: 5
get cuteness: function () {
set cuteness: function (value) {
id: 2
name: 'Boris'
get name: function () {
set name: function (value) {
__proto__: Object
但是如果我通过扩展DS.Model来实现这一点

App.Cat = DS.Model.extend({
  name: null,
  cuteness: null
})
我的Chrome控制台更像这样

__ecBitwiseColour: 3
__ecBitwiseCountry: 2
__ember1389472306613: "ember330"
__ember1389472306613_meta: Meta
_attributes: Object
_changesToSync: Object
_data: Object
_deferredTriggers: Array[0]
_inFlightAttributes: Object
_recordArrays: Ember.OrderedSet
_relationships: Object
_super: undefined
_suspendedRelationships: false
age: undefined
get age: function () {
set age: function (value) {
container: Container
currentState: (...)
get currentState: function () {
set currentState: function (value) {
data: (...)
errors: Class
id: "2"
name: undefined
get name: function () {
set name: function (value) {
store: Class
toString: function () { return ret; }
__proto__: Object
所有我的数据都在
\u data
属性下,但作为此对象的一部分,就像从
Ember.object
扩展时一样


我的问题是,为什么会发生这种情况,以及是否存在这样的情况,以便我可以将我的
DS.models
EmberCrossfilter
一起使用。实际上,属性存储在Ember Data
\u Data
(保存的数据)、
\u attributes
(脏属性值)、
\u inFlightAttributes
(正在保存和即将应用于
\u数据的值)

这就是为什么您应该始终使用getter,如果您没有这样做,您可能会看到不正确的数据。getter将按顺序查询
\u attributes
\u inFlightAttributes
,然后查询
\u data

它这样实现的原因是为了脏属性检查、回滚能力等

现在,EmberCrossFilter由于不使用getter而作弊,不幸的是,这是Ember世界中的一个主要禁忌。计算属性不起作用,事实上,这只适用于POJO和属性(未计算)位于对象上的对象

我可能会fork/PR并将所有直接引用切换到getter

   // Initialise the sorting using Crossfilter's `quicksort`.
    var sortAlgorithm   = crossfilter.quicksort.by(function(d) { return d[property]; });


etc

非常感谢,我担心可能是这样的!看起来我有一些工作要做。实际上,这并不像我想的那么难。这样做有什么区别:
Em.get(d,property)
d.get(property)
?如果对象不是余烬对象,get方法就不会附加到它(即POJO,您不能调用
POJO.get()
),但如果您只是处理余烬数据记录和扩展余烬.Object的对象,则可以使用
obj.get
    // Initialise the sorting using Crossfilter's `quicksort`.
    var sortAlgorithm   = crossfilter.quicksort.by(function(d) { return Em.get(d,property); });