在EmberJS中,如何删除对商店中对象的所有引用?

时间:2016-04-11 14:33:30

标签: ember.js

以下是我写过的模型的代码:

export default Ember.Route.extend({
  orgs: [],
  superOrgRecord: null,

  getsuperOrg: Ember.computed('orgs', function () {
    var super_org = this.get('orgs').findBy('name', 'test org');
    var super_org_record = this.store.peekRecord('org', super_org.id);

    for (var i = 0; i < super_org.users.length; i++) {
      var super_org_user = this.store.createRecord('user', { name: super_org.users[i].name,
                                                               org: super_org_record });
      for (var j = 0; j < super_org.users[i].roles.length; j++) {
        super_org_user.get('roles').addObject(this.store.createRecord('role', { name: super_org.users[i].roles[j].name }));
      }
    }

    this.setProperties({superOrgRecord: super_org_record});
    return super_org_record;
  }),

    redirect: function() {
        var user = this.modelFor('application').user;
        if(Ember.isEmpty(user.get('auth')) || Ember.isEmpty(user.get('org').get("id"))){
            this.transitionTo('login');
        }
    },

    beforeModel: function() {
        var _this = this;
        return ajax({
            url: _this.modelFor('application').url + '/org_user_list.json/?auth_token=' + _this.modelFor('application').user.get('auth'),
            type: 'get',
        }).then(
            function(result) {
                _this.setProperties({
              orgs: result,
            });
            },
            function(error) {
                alert(error.jqXHR.responseText);
            }
        );
    },

    model: function() {
        return Ember.RSVP.hash({
      orgs: this.get('orgs'),
            superOrg: this.get('getsuperOrg')
    });
    },

  // TODO I thought this would fix duplicating the super org records but it didn't
  // deactivate: function() {
  //   if (this.superOrgRecord) {
  //     this.superOrgRecord.get('users').forEach( function(user) {
  //       user.get('roles').forEach( function(role) {
  //         this.store.unloadRecord(role); // also tried deleteRecord()
  //       });
  //       this.store.unloadRecord(user);
  //     });
  //   }
  // },

  actions: {
    error(error) {
      if (error.message === "Cannot read property 'id' of undefined") {
        this.redirect();
      } else {
        return;
      }
    }

    // TODO I thought this would fix duplicating the super org records but it didn't
    // willTransition(transition) {
    //   if (this.superOrgRecord) {
    //     this.superOrgRecord.get('users').forEach( function(user) {
    //       var roleObjects = user.get('roles');
    //       user.get('roles').removeObjects(roleObjects);
    //     });
    //     var userObjects = this.superOrgRecord.get('users');
    //     this.superOrgRecord.get('users').removeObjects(userObjects);
    //   }
    //   return true;
    // }
  }
});

计算属性getsuperOrg正确完成其工作。每次加载此路由时都会运行(在model方法中)。现在,当我从这个模型转换时,我想删除对我刚刚添加到商店的这些userrole对象的所有引用,因为它们只是暂时的,用于返回模型调用生成的值(您可以质疑我这样做的原因,现在让我们假设它必须以这种方式完成)。当我重新加载这个模型时,最终会在商店中复制这些项目,并在以后混淆我的组件的渲染结果。我还在代码中注明了(已注释掉),有两种不同的技术尝试使用deactivatewillTransition完成此操作。两者都执行时没有错误,但实际上都没有完成工作 - 当我再次加载此模型第二次或以后时,继续呈现其他usersroles

请帮忙;感谢。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是store.unloadAll(<type>) 这将从商店

卸载指定<type>的所有记录