1

Konckout、Breeze JS、Durandal JS、ASP.NET Web API を使用していますが、私の質問は Breeze と Knockout に固有のものです。

Breeze クエリによって返されたエンティティから Knockout オブザーバブルの拡張を自動化するにはどうすればよいですか?

Breeze を介して返される顧客のリストがあり、表示可能にしたい DB 固有のフィールドがあります。特に私が欲しい:

  • UTC タイムスタンプ (例: "2011-07-02 13:20:13.8061582 +00:00") は、ローカルの日付と時刻として表示されます (例: "July 2, 2011 1:20 PM")
  • 通貨 (例: "$2500.12") としてフォーマットされる小数の金額 (例: "2500.12")
  • ステータスに基づいて特定の css クラスを追加します (例: is Status="Available", add cssStatus="item-available")

私が読んだことから (私が間違っている場合はお知らせください)、これを行う方法は、カスタムバインディングを使用するのではなく、.extend()関数を使用して KO オブザーバブルを拡張することです。

私の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 --

参考までに、ここにも私のviewmdelがあります

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 を受け入れ、各結果をループして展開するある種のマッピング関数が必要だと考えています...例をいただければ幸いです...

4

2 に答える 2

1

書式設定だけの場合は、カスタム バインドの方がシンプルで保守しやすいです。モデルを拡張する必要がある場合は、サーバーからモデルを取得するときに変換を適用して、すべてのエンティティが必要なものを持つようにします。例えば:

var entities = getEntitiesFromTheServer();

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

このようにしてバインドできます:

<span data-bind="text: formattedCurrency"></span>
于 2013-05-24T18:47:16.503 に答える
0

また、observableArray を拡張するために push() を使用できます

このような:

   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/

それがあなたを助けたことを願っています

于 2013-08-30T02:12:16.653 に答える