在 Ember 控制器中按日期过滤模型
Filter Model In By Dates in Ember Controller
我有这个DS.Model
Model = DS.Model.extend
date: DS.attr "string"
amount_payed: DS.attr "string"
user_name:DS.attr "string"
`export default Model`
目前我的控制器里没有任何东西
Controller = Em.Controller.extend()
export default Controller
这是路线
Route = Ember.Route.extend
model: () ->
return @store.find "user-account"
`export default Route`
我从服务器收到 json 的响应,日期值类似于
"date": "1995-12-25 00:00:00"
这是示例模板
{{#each detail in model}}
<li>{{detail.date}}{{detail.amount_paid}}{{detail.user_name}}</li>
{{/each}}
如何 sort/filter 我的控制器中的模型,以便当模板使用 {{#each detail in model}}
呈现模型时显示最新日期的详细信息 first.Basically 我想对模型进行排序使用日期 property.Remember 日期类似于 "date": "1995-12-25 00:00:00"
。
如果你们也可以在 javascript 中给出解决方案(不一定是 coffescript)
就可以了
有几种方法可以做到这一点:computed.sort
、SortableMixin
、实现自定义排序功能。
目前棘手的事情是您的日期是字符串,因此您需要将它们转换为可以运行 比较的内容(数字时间戳或日期对象等)。您可以在排序期间(在排序函数内)或在模型本身上执行该转换,以便您可以在应用程序的其他位置更轻松地重用和格式化日期。
我在下面提供的示例在排序期间进行转换。请注意,由于 Safari 中日期解析的错误,您不能只执行 (new Date(string))。
此答案假定使用 ember-cli 和语法,这是 Ember 2.0
的当前最佳实践
computed.sort
的文档在这里:http://emberjs.com/api/classes/Ember.computed.html#method_sort
import Ember from 'ember';
const {
computed,
Controller
} = Ember;
export default Controller.extend({
sortedModel: computed.sort('model', function(a, b) {
let timestampA = makeTimestamp(a);
let timestampB = makeTimestamp(b);
if (timestampA > timestampB) {
return 1;
} else if (timestampA < timestampB) {
return -1;
}
return 0;
})
});
// ideally you'd just return date, and call this makeDate
// and probably you'd do this when setting the date onto the model
function makeTimestamp(dateString) {
let arr = dateString.split(/[- :]/);
let date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
date.setTime( date.getTime() - date.getTimezoneOffset() * 60 * 1000 );
return date.getTime();
}
然后您可以像这样在您的模板中使用它。
{{#each sortedModel as |detail|}}
<li>{{detail.date}}{{detail.amount_paid}}{{detail.user_name}}</li>
{{/each}}
快速说明,{{#each detail in model}}
是一种已弃用的语法,从 ~1.10 开始的当前语法是 {{#each model as |detail|}}
。
我有这个DS.Model
Model = DS.Model.extend
date: DS.attr "string"
amount_payed: DS.attr "string"
user_name:DS.attr "string"
`export default Model`
目前我的控制器里没有任何东西
Controller = Em.Controller.extend()
export default Controller
这是路线
Route = Ember.Route.extend
model: () ->
return @store.find "user-account"
`export default Route`
我从服务器收到 json 的响应,日期值类似于
"date": "1995-12-25 00:00:00"
这是示例模板
{{#each detail in model}}
<li>{{detail.date}}{{detail.amount_paid}}{{detail.user_name}}</li>
{{/each}}
如何 sort/filter 我的控制器中的模型,以便当模板使用 {{#each detail in model}}
呈现模型时显示最新日期的详细信息 first.Basically 我想对模型进行排序使用日期 property.Remember 日期类似于 "date": "1995-12-25 00:00:00"
。
如果你们也可以在 javascript 中给出解决方案(不一定是 coffescript)
有几种方法可以做到这一点:computed.sort
、SortableMixin
、实现自定义排序功能。
目前棘手的事情是您的日期是字符串,因此您需要将它们转换为可以运行 比较的内容(数字时间戳或日期对象等)。您可以在排序期间(在排序函数内)或在模型本身上执行该转换,以便您可以在应用程序的其他位置更轻松地重用和格式化日期。
我在下面提供的示例在排序期间进行转换。请注意,由于 Safari 中日期解析的错误,您不能只执行 (new Date(string))。
此答案假定使用 ember-cli 和语法,这是 Ember 2.0
的当前最佳实践computed.sort
的文档在这里:http://emberjs.com/api/classes/Ember.computed.html#method_sort
import Ember from 'ember';
const {
computed,
Controller
} = Ember;
export default Controller.extend({
sortedModel: computed.sort('model', function(a, b) {
let timestampA = makeTimestamp(a);
let timestampB = makeTimestamp(b);
if (timestampA > timestampB) {
return 1;
} else if (timestampA < timestampB) {
return -1;
}
return 0;
})
});
// ideally you'd just return date, and call this makeDate
// and probably you'd do this when setting the date onto the model
function makeTimestamp(dateString) {
let arr = dateString.split(/[- :]/);
let date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
date.setTime( date.getTime() - date.getTimezoneOffset() * 60 * 1000 );
return date.getTime();
}
然后您可以像这样在您的模板中使用它。
{{#each sortedModel as |detail|}}
<li>{{detail.date}}{{detail.amount_paid}}{{detail.user_name}}</li>
{{/each}}
快速说明,{{#each detail in model}}
是一种已弃用的语法,从 ~1.10 开始的当前语法是 {{#each model as |detail|}}
。