我正在尝试实施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.models
和EmberCrossfilter
。
答案 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); });
等