Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 余烬js@每个层次都很深,但我有两个层次的关系_Ember.js_Computed Properties - Fatal编程技术网

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
    by
    bars
    。您将拥有一个条形阵列
  • bar:computed('barsArrays.[]')
    ——将其展平以接收一个条形阵列
  • bazesArrays:computed('bar.@each.bazes')
    --映射
    bar
    by
    bazes
  • bazesArrays:computed('bazesArrays.[]')
    --展平
    bazesArrays
  • bazesNames:computed('bazes@each.name')
    --map
    bazes
    by
    name
如何使链条变短 请注意,通过依赖于
bar.bazes
是一个永远不会被其他数组替换的关系数组(仅其内容发生更改,但数组对象保持不变),可以缩短此链(但不一定提高性能)

  • bazesArrays:computed('foos.@each.bar')
    --映射
    foos
    by
    bar
    ,展平,然后映射
    bazes
    。您将有一个baze数组
  • bazesArrays:computed('bazesArrays.[]')
    --展平
    bazesArrays
  • bazesNames:computed('bazes@each.name')
    --map
    bazes
    by
    name
这是一个有效的演示:

在这一行中,您实际上是在尝试创建一个别名,这是一个正确的想法,因为它是一个“模型级”关注点。。您将在控制器级别执行此操作

您可以在模型定义上创建
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'));
});