gpt4 book ai didi

ember.js - 在保存到服务器之前更改 Ember 模型的值

转载 作者:行者123 更新时间:2023-12-02 00:13:51 25 4
gpt4 key购买 nike

我有一个 Ember 模型,其中有一个我想显示和使用的字段,但在我保存它或从服务器检索它之前,我想将它乘以/除以 1000。

这意味着 UI 应该始终使用较小的值,但将较大的值保存到服务器。同样,它应该从服务器检索一个更大的值,但在允许 Controller 、路由等使用它之前将其变小。

// models/my_model.js
import DS from 'ember-data';

export default DS.Model.extend({
name: DS.attr('string'),
value: DS.attr('number')
});

基本上,我希望我的应用程序将这些字段显示为:

/* my webpage */
Please enter name: "foo"
Please enter value: 5

但是当我发送请求时,它应该将它们发送为:

{
"my_model": {
"name": "foo",
"value": 5000
}
}

它应该以这种格式接收它们,然后通过除以 1000 来反序列化该值。

请注意,乘以/除以 1000 只是一个示例 - 我可能想要追加、前置、加、减等。


我试着用一种不太优雅的方式来做到这一点:

// Controller.js
actions: {
save: function() {
this.set('model.value', this.get('model.value') * 1000);
this.get('model').save().then(
/* stuff */
);
this.set('model.value', this.get('model.value') / 1000);
}
}

但我对此并不满意,它会导致难以维护且容易出错的重复代码。

我有一个RESTSerializer,但我不知道如何使用它来操作字段,并且在the documentation 中找不到任何内容。 .也许我需要使用不同的序列化程序?到目前为止我的基本上是空的。

// serializers/my_model.js
import DS from 'ember-data';

export default DS.RESTSerializer.extend({
primaryKey: 'name',
});

最佳答案

我建议使用 Ember Data transform对于那个用例。与重写 Serializer 的 normalizeserialize 方法相比,它的可重用性和关注点分离效果更好。 Ember 数据转换可以看作是属性特定(反)序列化器。有一些内置转换:stringnumberbooleandate。您已经在使用其中的一些。

您应该从默认蓝图开始编写自定义序列化程序:ember generate transform currency。这将生成一个文件 app/transforms/currency.js 和相关的单元测试。转换扩展 DS.Transform 类并且必须实现 serializedeserialize 方法。他们获取(反)序列化值作为参数,并应返回相反的值。

重构您给出的示例作为转换的答案,看起来像这样:

// app/transforms/currency.js

import DS from 'ember-data';

export default DS.Transform.extend({
deserialize(serialized) {
return serialized / 1000;
},

serialize(deserialized) {
return deserialized * 1000;
}
});

可以这样使用:

// models/my_model.js
import DS from 'ember-data';

export default DS.Model.extend({
name: DS.attr('string'),
value: DS.attr('currency')
});

最大的好处是它可以根据需要应用于任意多的模型中的任意多的属性。它还可以在分离其他序列化问题时进行单元测试,并且可以作为 Ember 插件在应用程序之间轻松共享。

关于ember.js - 在保存到服务器之前更改 Ember 模型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57650898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com