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
Ember.js 延迟加载导致Ember中未定义的数据_Ember.js_Ember Data - Fatal编程技术网

Ember.js 延迟加载导致Ember中未定义的数据

Ember.js 延迟加载导致Ember中未定义的数据,ember.js,ember-data,Ember.js,Ember Data,我使用了一周的ember.js,遇到了一个关于ember数据和ember.js的问题。在名为User的模型上,我有一个简单的1:N关系用户有许多插槽,这些插槽由开始时间和结束时间定义 在一个名为每天插槽的组件中给定用户的所有插槽都会使用以下js代码按天过滤: /* ... rest of component.js of slots-per-day ... */ filteredSlots: Ember.computed('user', function() { let time

我使用了一周的ember.js,遇到了一个关于ember数据和ember.js的问题。在名为
User
的模型上,我有一个简单的1:N关系<代码>用户有许多
插槽
,这些插槽由
开始时间
结束时间
定义

在一个名为
每天插槽的组件中
给定用户的所有插槽都会使用以下js代码按天过滤:

  /* ... rest of component.js of slots-per-day ... */
  filteredSlots: Ember.computed('user', function() {
    let time = moment();
    return this.get('user.slots').filter( (slot) => {
      let left = moment(time).startOf('day');
      let right = moment(time).endOf('day');
      let start_time = moment(slot.get('start_time'));
      let end_time = moment(slot.get('end_time'));
      console.debug(slot.get('start_time'));

      return start_time.isBetween(left, right) || end_time.isBetween(left, right);
    });
  })
  /* ... rest of component.js of slots-per-day ... */
我在不同的方法中遇到了几个问题:

  • 使用filteredSlots属性上方的代码只计算一次。底层存储处于未定义状态,因为
    控制台.debug
    输出
    未定义
    ,但插槽数量刚好合适。所以我猜ember data已经加载了插槽的数组,但是忘记加载其余的数据了。如果我转换到同一路线,所有数据都会正确显示,
    console.debug
    返回不同的矩.js-dates

  • 如果我将
    user.slots
    添加到该属性的依赖项列表中,它将被计算两次。这两种计算都会产生与(1)中相同的调试输出:
    未定义

  • 如果我添加
    user.slots.@each.start\u time
    ,则该属性的计算值为该页上的组件数量乘以插槽数量(非常慢)。尽管它速度很慢,但它仍能正常工作并正确呈现数据

  • 所以问题是:在渲染组件之前,如何预加载余烬数据中的所有数据

    编辑

    我也尝试过承诺:

      /* SlotRoute ... */    
      setupController(controller, model){
        this._super(controller, model);
        controller.set('time', this.get('time'));
        controller.set('users', model.users);
        controller.set('timeScope', this.get('timeScope'));
      },
    
      users: Ember.computed('time', function() {
        return this.store.query('user', {
          slots: {
            time: this.get('time').toString(),
            timeScope: this.get('timeScope')
          }
        });
      }),
    
      model(params) {
        return Ember.RSVP.hash({
          users: this.get('users'),
          slots: this.store.get('slots')
        });
      },
      /* ... */
    

    上面列表的位置(1)、(2)和(3)没有变化。

    第3号是写入计算属性的正确方法,尤其是使用异步关系时。您必须在某处支付价格,如果您想在过渡期间支付,您可以使用
    afterModel
    假设您使用
    model
    钩子获取用户。如果在其他地方加载,您还可以使用该特定路线的
    afterModel
    /
    beforeModel

    路线

    model(params){
      return this.store.find('user', 1);
    },
    afterModel(model, transition){
      return model.get('slots');
    }
    
    使用某种服务的路线

    afterModel(model, transition){
      return this.get('someservice.user.slots');
    }
    

    这不符合预期。我不得不对我的代码进行一些修改,因为这条路线涉及所有用户。但行为没有改变。每个用户都会多次渲染该组件。还有其他想法吗?承诺可能是解决方案吗?这是承诺路线,因为我们将承诺返回给afterModel挂钩,它在继续之前等待承诺解决。听上去,你有一系列的承诺,如果你用吸引用户的路线(可能还有你尝试过的路线)更新你的问题,然后我会用相应的解决方案更新答案,这将是最简单的。