我最近在 ExtJS 关联方面经历了一段非常痛苦的学习曲线,并且遇到了一些有用的文章,以及我自己的问题。这是为那些遇到同样痛苦的人提供的摘要。
ExtJS 中 HasMany 关联的规则
- 始终将您的代理放在您的模型中,而不是您的商店中,除非您有充分的理由不 [1]
- 如果在 hasMany 关系中使用它们,则始终需要您的子模型。[2]
- 如果您想随意加载孩子,请始终使用 foreignKey
- 如果您在与父级相同的响应中返回子级,请始终使用 associationKey
- 如果您愿意,可以同时使用 foreignKey 和 associationKey
- 始终命名您的 hasMany 关系
- 始终在您的 hasMany 关系中使用完全限定的模型名称
- 考虑给读者根一个有意义的名字(除了“数据”)
- 子模型不需要为 hasMany 工作的 belongsTo 关系
[1] store 将继承其模型的代理,您可以随时覆盖它
[2] 为方便起见,并避免潜在的循环引用,您可以在 app.js 中使用它们
http://extjs-tutorials.blogspot.com/2012/05/extjs-hasmany-relationships-rules.html
ExtJS 中 HasOne 和 BelongsTo 关联的规则
- 将代理放入模型中,除非您有充分的理由不这样做
- 始终使用完全限定的型号名称
- 始终设置 getterName
- 始终设置 setterName
- 如果在与此对象相同的响应中返回外来对象,则始终设置关联键
- 总是设置foreignKey,如果你想随意加载外物
- 考虑将 instanceName 更改为更短的名称
- 根据是否加载了外来对象,getter 的行为会有所不同。如果已加载,则返回外来对象。否则,你需要传入一个回调来获取它。
- 如果您打算覆盖此关联,则应设置 name 属性。
- 你不需要为 hasMany 工作的 belongsTo 关系
- 如果父模型的 id 字段不是“id”,则设置 primaryKey 属性
- 有时您需要对 belongsTo 关联使用 uses 或 requires 。不过要注意循环引用。
- 调用 setter() 函数似乎没有设置实例。如果调用 setter(),则设置 object.belongsToInstance = obj。
http://extjs-tutorials.blogspot.com/2012/05/extjs-belongsto-association-rules.html
杂项
- 如果您将数据应用到网格,请确保使用新存储在网格上调用 reconfigure()
- 您的“foreignKey”属性将作为本地过滤器应用于 ExtJS 存储;如果您看到数据通过网络加载,但未显示在网格中,请确保您的模型将 foreignKey 值定义为字段,否则本地过滤器将排除数据安静。要测试是否是这种情况,请连接到商店的“加载”事件并调用 store.clearFilters(),然后查看您的数据是否显示