簡體   English   中英

Ember Data Transform中的訪問控制器屬性

[英]Access controller properties within Ember Data Transform

我喜歡在Ember Data Transform中訪問控制器屬性。 無論如何,該怎么做?

也許對我的用例來說幾句話。 我喜歡創建一個自定義屬性'encryptedStrings',並使用DS.Transform通過使用Stanford Javascript加密庫對具有給定密鑰的字符串進行加密/解密。 鍵應該部分地在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') );

有趣! 我想知道將加密密鑰公開在URL中是否是一個好主意。 但是,假設這是您要執行的操作,而不是將數據作為序列化程序的一部分進行轉換,我想我要做的是將鍵設置為模型上的屬性(從暴露queryParam的路由開始)。 然后,讓未加密的值成為基於密鑰和加密后的值(通常為常規DS.attr()得出的模型上的計算屬性。 計算屬性既可以是getter,也可以是setter,因此,如果在未加密的屬性上設置了新值,則只需設置重新加密的值即可。

更新:

這是如何以可重用的方式編寫計算屬性的示例:

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:

您可以通過Route在模型上設置加密密鑰,如下所示:

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')
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM