在Ember数据转换中访问控制器属性

时间:2014-02-01 03:46:36

标签: javascript ember.js ember-data

我喜欢在Ember Data Transform中访问控制器属性。反正怎么办?

也许对我的用例说几句话。我喜欢创建自定义属性'encryptedStrings'并使用DS.Transform使用Stanford Javascript Crypto Library使用给定密钥加密/解密字符串。密钥应该是uri中的查询参数。

get方法在DS.Transform中定义,但我没有进一步。这里是代码的相关部分:

App.EncryptedStringTransform = DS.Transform.extend({
    deserialize: function(serialized) {
       var key = this.get('pollController.encryptionKey');
       return Ember.isNone(serialized) ? null : String( sjcl.decrypt( key , serialized) );
    },
    serialize: function(deserialized) {
       var key = this.get('pollController.encryptionKey');
       return Ember.isNone(deserialized) ? null : String( sjcl.encrypt( key , deserialized) );
    }
});

App.PollController = Ember.ObjectController.extend({
    queryParams: ['encryptionKey'],
    encryptionKey: 'default'
});

而不是

this.get('pollController.encryptionKey');

我也试过这个:

console.log( this.get('controller.encryptionKey') );
console.log( this.get('controllers.poll.encryptionKey') );
console.log( this.get('controllers.pollController.encryptionKey') );

1 个答案:

答案 0 :(得分:0)

有趣!我想知道将加密密钥暴露在URL中是否是个好主意。但是,假设这是您想要做的,而不是将数据转换为序列化程序的一部分,我认为我要做的是将键设置为模型上的属性(从queryParam公开的路径)。然后,将未加密的值计算在模型上的属性,这些属性是基于密钥和加密值派生的,这些值只是常规的DS.attr()。计算属性can be both getters and setters因此,如果在未加密的属性上设置了新值,则只需设置重新加密的值。

<强>更新

以下是如何以可重用的方式编写计算属性的示例:

Ember.computed.encrypted = function(encryptedField, keyField) {
  return Ember.computed(encryptedField, keyField, function(key, decryptedValue) {
    var encryptKey = this.get(keyField), encryptedValue;
    //setter
    if (arguments.length == 2) {
      encryptedValue = Ember.isNone(decryptedValue) ? null : String( sjcl.encrypt( encryptKey , decryptedValue) );
      this.set(encryptedField, encryptedValue);
    }
    encryptedValue = this.get(encryptedField);
    return Ember.isNone(encryptedValue) ? null : String( sjcl.decrypt( encryptKey , encryptedValue) );
  });
};

然后,您可以像这样编写模型:

App.SensitiveData = DS.Model.extend({
  encryptKey:      DS.attr('string'),
  encryptedField1: DS.attr('string'),
  encryptedField2: DS.attr('string'),
  decryptedField1: Ember.computed.encrypted('encryptedField1','encryptKey'),
  decryptedField2: Ember.computed.encrypted('encryptedField2','encryptKey')
});

更新2:

您可以通过路线在模型上设置加密密钥,如下所示:

App.SensitiveDataRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('sensitive-data', params.sensitive_data_id).then(function(sensitiveData) {
      sensitiveData.set('encryptKey', params.encryption_key);
      return sensitiveData;
    });
  }
});

或者,假设数据不是通过路径暴露,而是仅通过控制器暴露,您可以将一个观察者添加到控制器并通过观察者设置值,如下所示(注意,这可能不是甚至是必要的,并且由于控制器代理模型,只要模型中的属性与控制器中指定的查询参数名称匹配,您甚至不需要执行观察者逻辑,我需要使用它要肯定地说):

App.SensitiveDataController = Ember.ObjectController.extend({
  queryParams: ['encryptionKey'],
  encryptionKey: null,

  updateEncryptKey: function() {
    this.set('encryptKey', this.get('encryptionKey'))
  }.observes('encryptionKey')
});