fgu*_*len 6 ember.js ember-data
我正在尝试监控DS模型上的状态更改.
我在文档中找到了有趣的标志:
并且它们在模板中正常工作{{#if model.isLoading}}Is Loading{{/if}},例如,我可以使用它.
但令人不安的是,这些旗帜中的观察者具有非常随机的行为.例如,我发现公寓的观察者isSaving根本不起作用.但是国旗上的观察者isReloading完美无缺.
在这里,我有一个完整的例子,说明我迄今为止所尝试过的事情.我把这个Mixin包含在我的模型中:
// app/models/mixins/loading-monitoring
import Ember from 'ember';
export default Ember.Mixin.create({
isReloadingDidChange: Ember.observer('isReloading', function() {
console.log('LOG: isReloadingDidChange', this.get('id'), this.get('isReloading'));
}),
isSavingDidChange: Ember.observer('isSaving', function() {
console.log('LOG: isSavingDidChange', this.get('id'), this.get('isSaving'));
}),
isLoadingDidChange: Ember.observer('isLoading', function() {
console.log('LOG: isLoadingDidChange', this.get('id'), this.get('isLoading'));
}),
isLoadedDidChange: Ember.observer('isLoaded', function() {
console.log('LOG: isLoadedDidChange', this.get('id'), this.get('isLoaded'));
}),
onInit: Ember.on('init', function() {
console.log('LOG: init', this.get('id'));
}),
onDidLoad: Ember.on('didLoad', function() {
console.log('LOG: onDidLoad', this.get('id'));
}),
});
Run Code Online (Sandbox Code Playgroud)
我尝试调用所有这些观察者,但只触发了一些观察者:
> $E.toString()
"<reports-dashboard-client-app@route:application::ember1553>"
> var report; $E.store.findRecord('report', 14).then(function(r) { report = r });
Promise {_id: 438, _label: undefined, _state: undefined, _result: undefined, _subscribers: Array[0]}
LOG: init 14
XHR finished loading: GET "http://myapi.com/reports/14".
LOG: onDidLoad 14
> report.toString()
"<reports-dashboard-client-app@model:report::ember1554:14>"
> report.get('title')
"new title"
> report.set('title', 'title modified')
"title modified"
> report.save()
Class {__ember1453996199577: null, __ember_meta__: Meta}
XHR finished loading: PUT "http://myapi.com/reports/14".send
> report.reload()
LOG: isReloadingDidChange 14 true
Class {__ember1453996199577: null, __ember_meta__: Meta}
XHR finished loading: GET "http://myapi.com/reports/14".send
LOG: isReloadingDidChange 14 false
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
观察模型状态并对变化做出反应的方法是什么:加载,准备好了吗?
bma*_*mac 11
'isLoading','isLoaded'和'isSaving'属性都是作为计算属性实现的.在Ember中,计算属性是惰性的,在第一次使用.get或显示在模板中之前,它们不会计算它们的状态.因此,尽管概念上我们作为开发人员可能知道isLoading正在改变的值并且在record.get('isLoading')调用时将返回不同的值,但就Ember而言,值isLoading是未定义的,直到某些代码明确要求Ember获取该值并且Ember接受时间来计算它的状态.
因此,当您用于Ember.observer监视计算属性时,在其他某些代码尝试访问计算属性的值之前,它将无法检测到计算属性中的更改.
观察者还有一些你可能想要了解的其他问题.@stefanpenner有一个很好的谈论他们的问题https://www.youtube.com/watch?v=vvZEddrClAQ以及为什么他们应该谨慎使用.
为了让你的mixin触发观察者事件,你需要在某些地方访问这些属性.最好的地方就是你的onInit功能.如果添加this.getProperties('isReloading', 'isSaving', 'isLoading', 'isLoaded');到onInit函数中,则Ember将计算这些值,并且当更改这些属性的值时,观察者将正确触发.
在引擎盖下,Ember Data维护着状态机以达到记录.此状态机用于跟踪记录与服务器的关系.在较高的层次上,这些是Ember Data记录所处的状态:
empty是每条记录开始生命的状态.其他那个事实empty并不是很重要.
loading 当Ember Data第一次从服务器请求数据时,是否存在记录状态.
loaded一旦Ember Data从服务器收到有关记录的一些信息,状态是否会被记录.它有许多子状态,用于跟踪本地记录是否已更改,但尚未保存到服务器.如果在客户端创建记录,它将直接放入该loaded.created.uncommitted状态.
deleted是已删除记录的状态.该deleted.saved子状态意味着服务器已承认删除此记录的.该deleted.uncommitted子状态意味着有记录已被删除本地,但record.save()没有被调用.
记录的当前状态由currentState记录中的属性公开.isLoading,isLoaded和isSaving对于所有别名currentState.isLoading,currentState.isLoaded,currentState.isSaving如在状态机的每个状态具有预定义的值,所有这些性质.
我希望DS.Model状态机的这个解释有所帮助.
另外要检查的是在DS.Model实例上公开的生命周期事件挂钩.
http://emberjs.com/api/data/classes/DS.Model.html#event_becameError
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |