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
Javascript Ember数据转换中的访问控制器属性_Javascript_Ember.js_Ember Data - Fatal编程技术网

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

Javascript Ember数据转换中的访问控制器属性,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我喜欢访问Ember数据转换中的控制器属性。有没有办法做到这一点 也许对我的用例说几句话。我喜欢创建一个自定义属性“encryptedStrings”,并通过使用Stanford Javascript Crypto Library使用DS.Transform对给定密钥的字符串进行加密/解密。该键应在uri中部分地包含一个查询参数 get方法是在DS.Transform中定义的,但我没有进一步了解。以下是守则的相关部分: App.EncryptedStringTransform = DS.Tran

我喜欢访问Ember数据转换中的控制器属性。有没有办法做到这一点

也许对我的用例说几句话。我喜欢创建一个自定义属性“encryptedStrings”,并通过使用Stanford Javascript Crypto Library使用DS.Transform对给定密钥的字符串进行加密/解密。该键应在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中公开加密密钥是否是个好主意。但是,假设这是您想要做的,而不是将数据转换为序列化程序的一部分,我想我应该做的是将key设置为模型上的一个属性,该属性来自queryParam公开的路由。然后,在模型上计算未加密的值,这些属性是基于密钥和加密值派生的,而加密值只是常规的DS.attr。因此,如果在未加密的属性上设置了一个新值,则可以只设置重新加密的值

更新:

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

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')
});
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;
    });
  }
});
更新2:

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

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

将url中的键作为片段标识符的一部分对my:1有好处。当用户想要共享内容时,他们不必关心加密密钥。他们只需要共享url。2.浏览器未将片段标识符发送到服务器。使用计算属性是一种有趣的方法。但是,如何告诉余烬数据只是为了将计算出的属性发送到服务器?我以为余烬数据只关心非计算属性,但还没有测试。啊,好的。好吧,我想我剩下的答案应该行得通。您肯定不想在序列化层中公开控制器。我认为将密钥添加到模型中,然后通过计算属性进行解密/加密是一个更好的方法。添加我的评论的第二部分:如何告诉余烬数据只是为了将计算属性发送到服务器而迟到?我以为余烬数据只关心非计算属性,但还没有测试。等一下,我会更新我的帖子,说明如何做到这一点。这有帮助吗?