gpt4 book ai didi

ember.js - EmberJS,了解 DS 模型生命周期

转载 作者:行者123 更新时间:2023-12-02 19:33:27 38 4
gpt4 key购买 nike

我正在尝试监控 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 将计算这些值并当这些属性的值发生更改时,观察者将正确触发。

DS.Model 生命周期

在底层,Ember Data 维护着一个状态机来记录到达情况。该状态机用于跟踪记录与服务器的关系。在较高级别上,这些是 Ember 数据记录可能处于的状态:

  • 加载中
  • 已加载
    • 已创建
      • 未 promise
      • 飞行中
    • 已保存
    • 已更新
      • 未 promise
      • 飞行中
  • 已删除
    • 已保存
    • 未 promise
    • 飞行中

empty 是每条记录开始其生命的状态。除此之外,empty 这个事实并不是很重要。

loading 是 Ember Data 第一次从服务器请求数据时记录所处的状态。

loaded 是 Ember Data 从服务器接收到有关记录的一些信息后记录放入的状态。它有许多子状态,用于跟踪本地记录是否发生了尚未保存到服务器的更改。如果在客户端创建记录,则会直接将其置于 loaded.created.uncommissed 状态。

deleted 是已删除记录的状态。 deleted.saved 子状态表示服务器已确认删除该记录。 deleted.uncommissed 子状态意味着记录已在本地删除,但 record.save() 尚未被调用。

记录的当前状态由记录上的 currentState 属性公开。 isLoadingisLoadedisSaving 都是 currentState.isLoadingcurrentState.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/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com