- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试监控 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'));
}),
});
我尝试调用所有这些观察者,但只有一些被触发:
> $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
我错过了什么?
观察模型状态并对变化使用react的方法是什么:正在加载、准备?
最佳答案
“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 数据记录可能处于的状态:
empty
是每条记录开始其生命的状态。除此之外,empty
这个事实并不是很重要。
loading
是 Ember Data 第一次从服务器请求数据时记录所处的状态。
loaded
是 Ember Data 从服务器接收到有关记录的一些信息后记录放入的状态。它有许多子状态,用于跟踪本地记录是否发生了尚未保存到服务器的更改。如果在客户端创建记录,则会直接将其置于 loaded.created.uncommissed
状态。
deleted
是已删除记录的状态。 deleted.saved
子状态表示服务器已确认删除该记录。 deleted.uncommissed
子状态意味着记录已在本地删除,但 record.save()
尚未被调用。
记录的当前状态由记录上的 currentState
属性公开。 isLoading
、isLoaded
和 isSaving
都是 currentState.isLoading
、currentState.isLoaded
的别名>, currentState.isSaving
因为状态机中的每个状态都有所有这些属性的预定义值。
我希望对 DS.Model 状态机的解释有所帮助。
另外需要检查的是 DS.Model
实例上公开的生命周期事件 Hook 。 http://emberjs.com/api/data/classes/DS.Model.html#event_becameError
关于ember.js - EmberJS,了解 DS 模型生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35139936/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!