Ember.js 余烬js@每个层次都很深,但我有两个层次的关系
我必须访问控制器上两层深度的属性,但是Ember.js 余烬js@每个层次都很深,但我有两个层次的关系,ember.js,computed-properties,Ember.js,Computed Properties,我必须访问控制器上两层深度的属性,但是[]只能通过emberjs指南访问一层深度 model(params) { params.paramMapping = { page: "page", perPage: "per_page", total_pages: "pages" }; return this.findPaged('contractf', params); }, setupController(controlle
[]
只能通过emberjs指南访问一层深度
model(params) {
params.paramMapping = {
page: "page",
perPage: "per_page",
total_pages: "pages"
};
return this.findPaged('contractf', params);
},
setupController(controller, model) {
model.forEach(function(item) {
item.set('sale_price', item.get('dealers_sched_id.sale_price'));
});
controller.set('content', model);
},
上面,我有一个模型,它基本上是在contractf模型中以分页格式获取所有记录。然后我设置我的控制器并循环所有这些模型,并绑定一个进入其关系的sale\u price
属性,以获得正确模型关系中的sale\u price
现在在我的模板中,我有以下内容:
new_suggested_price: Ember.computed('selectedItems', 'selectedItems.[].sale_price', function() {
var ret = 0;
this.get('selectedItems').filterBy('car_used', 'N').forEach(function(contract){
var salePrice = contract.get('sale_price');
if (salePrice) {
ret += (salePrice*100);
}
});
return ret/100; // We *100/100, so we avoid a floating point calc error.
}),
基本上只是给我一个容易格式化的数字。如您所见,它取决于selectedItems(基本上是模型,但通过属性进行过滤)。因此,我必须进入每个模型项目,找到我设置的sale\u price
I属性,如果它发生变化,这个计算属性将更新。阅读《恩伯指南》,我无法做selectedItems.[].dealers\u sched\u id.sale\u price
,因为它只深入了一层
我以为在setupController上设置属性可以解决这个问题,但似乎没有,因为我仍然得到NaN
作为sale\u price
值
现在,如果我将setTimeout函数设置为500毫秒,它会很好地填充。。如何在页面加载时定义它
感谢您的帮助。为什么会出现此问题
Ember API确实允许您在计算的属性依赖项中只使用一个级别的@每个
/[]
这种限制可能是人为的,因为使用两个或两个以上的@每个级别都会对内部观察者维护造成巨大的性能影响
因此,您必须避免CP依赖项链中出现多个@个/[]
。
如果你不能吃一个有N根蜡烛的蛋糕,那就吃N个蛋糕,每个蛋糕有一根蜡烛
但有时你的业务要求你必须达到或超过一个级别
不要害怕!这可以通过一系列计算属性来实现,其中每个属性只有一个@级别
比如说,你有Foo、Bar和Baz模型,你想依赖它们
foos.@each.bars.@each.bazes.@each.name
以下是需要创建的计算属性链:
barsArrays:computed('foos@each.bar')
--映射foos
bybars
。您将拥有一个条形阵列
bar:computed('barsArrays.[]')
——将其展平以接收一个条形阵列
bazesArrays:computed('bar.@each.bazes')
--映射bar
bybazes
bazesArrays:computed('bazesArrays.[]')
--展平bazesArrays
bazesNames:computed('bazes@each.name')
--mapbazes
byname
如何使链条变短
请注意,通过依赖于bar.bazes
是一个永远不会被其他数组替换的关系数组(仅其内容发生更改,但数组对象保持不变),可以缩短此链(但不一定提高性能)
bazesArrays:computed('foos.@each.bar')
--映射foos
bybar
,展平,然后映射bazes
。您将有一个baze数组
bazesArrays:computed('bazesArrays.[]')
--展平bazesArrays
bazesNames:computed('bazes@each.name')
--mapbazes
byname
这是一个有效的演示:
在这一行中,您实际上是在尝试创建一个别名,这是一个正确的想法,因为它是一个“模型级”关注点。。您将在控制器级别执行此操作
您可以在模型定义上创建computed.alias('deralers\u sched\u id.sale\u price')
,并避免所有额外的计算属性层
编辑:在您的情况下,我们处理的是异步关系
这意味着您需要意识到,当关系承诺仍在自行解决时,价值并不总是对您可用。您得到一个NaN
的原因是belongsTo在技术上仍然是“正在加载”。。。因此,您尝试执行的任何同步功能都可能失败
当您查看提供给您的涉及计算属性的两个答案时,请理解这两种方法都可以工作。。。当承诺解决时,他们将计算并重新计算
在代码中的某个地方,您可能正在尝试访问最终的值,在它真正为您准备好之前。。。可能是一个alert()
console.log()
或一个Ember的同步生命周期挂钩(提示:setupController)
另一种方法是,在解析路线之前,使用路线的model()
挂钩或afterModel()
请求经销商计划id
对象。。。它可能不太理想,但它可以确保您在尝试使用这些值之前拥有所需的所有数据。不过,我有一种多对一的关系selectedItems.[].dealers\u sched\u id.sale\u price
是我需要运行的。array.[].property
不是一个实际的东西,所以它可能不会以您期望的方式运行。我想这是一个错误:bar:computed('barz.[]')
,它不应该是bar:computed('barsArrays.''))
?Pavol:您是真正的MVP。是否有特殊原因使展平步骤必须是一个单独的计算属性?e、 g.难道你不能只计算bar:computed('foos.@each.bar')
和name:computed('bar.@each.name')
?我试着把别名放在模型上,但没有任何结果。它仍然会在没有设置计时器的情况下生成NaN。dealers\u sched\u id
是异步关系吗?或者它是一个嵌入式对象?它是一个异步关系!belongsTo@HaleySchillig我更新了我的答案,也许对你有所帮助more@locks这是一个很好的论点。。我甚至不知道
model.forEach(function(item) {
item.set('sale_price', item.get('dealers_sched_id.sale_price'));
});