繁体   English   中英

如何从Breeze查询返回的实体中自动扩展Knockout观测值?

[英]How do I automate extending Knockout observables from entities returned by Breeze query?

我正在使用Konckout,Breeze JS,Durandal JS,ASP.NET Web API,但我的问题仅针对Breeze和Knockout。

如何从Breeze查询返回的实体中自动扩展Knockout观测值?

我有一个通过Breeze返回的客户列表,他们有我想使其呈现的数据库特定字段。 我特别想要:

  • 显示为本地日期和时间的UTC时间戳(例如“ 2011-07-02 13:20:13.8061582 +00:00”)(例如“ 2011年7月2日下午1:20”)
  • 小数金额(例如“ 2500.12”)将被格式化为货币(例如“ $ 2500.12”)
  • 根据状态添加特定的CSS类(例如,Status =“ Available”,添加cssStatus =“ item-available”)

根据我的阅读( 如果我错了请告诉我 ),实现此目的的方法不再是使用自定义绑定,而是使用.extend()函数扩展KO可观察.extend()

我的dataservice.js具有以下Breeze查询,该查询接受可观察的并将其设置为数据结果。

// -- snip --
        function getCustomers(koCustomers) {
            var query = breeze.EntityQuery
                .from('Customers');

            return manager.executeQuery(query)
                .then(querySucceeded)
                .fail(queryFailed);

            function querySucceeded(data) {
                koCustomers([]);
                koCustomers(data.results);
            }
        }
// -- snip --

供参考的也是我的观点

define(['durandal/app',
        'durandal/system',
        'durandal/plugins/router',
        'services/config',
        'services/logger',
        'services/datacontext'],
    function (app, system, router, config, logger, datacontext) {
        'use strict';
    var customers = ko.observableArray();

    var viewModel = {
        title: 'Vehicles',
        activate: activate,
        customers: customers
    };
    return viewModel;

    function activate() {
        return datacontext.getCustomers(customers);
    }
});

我在想我需要某种映射函数,该函数将接受observable和data.results,然后循环遍历每个结果并将其扩展...任何示例将不胜感激...

如果只是格式化,那么自定义绑定将更简单且更易于维护。 如果您需要扩展模型,那么当您从服务器获取模型时,只需应用转换,以便每个实体都拥有您所需要的。 例如:

var entities = getEntitiesFromTheServer();

$.each(entities, function(i, entity){
    entity.formattedCurrency = ko.computed(function (){
        return '$' + entity.amount;
    });
});

这样,您可以绑定它:

<span data-bind="text: formattedCurrency"></span>

push()也可以用于扩展observableArray

像这样:

   function getCustomers(koCustomers) {
        var query = breeze.EntityQuery
            .from('Customers');

        return manager.executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);

        function querySucceeded(data) {
            koCustomers([]);
            var temp =ko.observable();
var p =ko.observableArray();
p(data.results).
var len= p().length();
var i;

for(i=0; i<len; i++)
{
temp(p()[i].amount())
var q=ko.computed(function(){
return {amount: '$' + temp()} ;
koCustomer().push(q);
});
}
}
}

对于日期格式,请使用dateString的自定义绑定

链接: http//www.aaronkjackson.com/2012/04/formatting-dates-with-knockoutjs/

希望对你有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM