Ember DS.model公开了数据属性

时间:2014-01-11 20:53:43

标签: javascript ember.js

我正在尝试实施Ember Crossfilter并取得了一些成功,我认为我的部分痛苦是由于某些数据属性未被曝光。

如此延伸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

我的所有数据都在_data属性下,但作为此对象的一部分,例如从Ember.Object扩展而来。

我的问题是,为什么会发生这种情况,而且无论如何我都可以使用DS.modelsEmberCrossfilter

1 个答案:

答案 0 :(得分:1)

实际上,属性存储在Ember数据_data(保存数据),_attributes(脏属性值),_inFlightAttributes中的三个位置(正在保存和即将存在的值)适用于_data)。

这就是为什么你应该总是使用一个getter,如果你没有这样做,你可能会看到不正确的数据。获取者将按顺序查询_attributes_inFlightAttributes,然后_data

这样实现的原因是出于脏属性检查,回滚能力等目的。

现在EmberCrossFilter因不使用吸气剂而作弊,不幸的是,这是Ember世界中的一个主要禁忌。计算属性不起作用,实际上这实际上只适用于POJO和对象上具有属性(未计算)的对象。

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

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

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