我正在尝试实现 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
一起使用。
最佳答案
其实在Ember Data中属性存储在三个地方_data
(保存的数据),_attributes
(脏属性值),_inFlightAttributes
(正在保存并将应用于 _data
的值)。
这就是为什么你应该总是使用 getter,如果你不这样做,你可能会看到不正确的数据。 getter 将依次查询 _attributes
、_inFlightAttributes
和 _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]; });
到
// Initialise the sorting using Crossfilter's `quicksort`.
var sortAlgorithm = crossfilter.quicksort.by(function(d) { return Em.get(d,property); });
等等
关于javascript - Ember DS.model 公开数据属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067748/