1

Breeze で計算値を作成し、Knockout でバインドするのに問題があります。

ここからダウンロードできる NoDb サンプル プロジェクトを使用しています。Breezeドキュメントのエンティティの拡張に関する記事が私の主な情報源です。

todo.datacontext.js ファイルで、次の変更を行いました: (コードを配置した正確な場所に関するガイダンスを提供するために、最初と最後の行を含めました)

...
configureManagerToSaveModifiedItemImmediately();

metadataStore.registerEntityTypeCtor('TodoItem', function () { }, todoItemInitializer);

function todoItemInitializer(todoItem) {
    todoItem.participantName = ko.computed(function () {
        return 'John' + ' ' + 'Smith';
    });
};

var datacontext = {
...

そして、Index.html に以下を追加しました。

...
<ul data-bind="foreach: todos">
   <li>
       <p data-bind="text: participantName" />
       <input type="checkbox" data-bind="checked: isDone" />
...

ただし、次のエラーが発生します。

todo リストの取得中にエラーが発生しました: バインディングを解析できません。メッセージ: ReferenceError: 参加者名が定義されていません。バインディング値: テキスト: 参加者名

これを実行すると、次のことにも気付きました。

metadataStore.getEntityType('TodoItem');

登録しているのに、そのようなタイプは存在しないと言っています。

何か案は?

4

1 に答える 1

0

ドキュメントとサンプルプロジェクトを深く掘り下げてみると、サーバーがメタデータを提供していない場合は、手動で作成してクライアントに登録する必要があることがわかりました。todo.model.jsを参照してください。以下は、コードの最も関連性の高い部分です。

var et = new EntityType({
            shortName: "TodoItem",
            namespace: "NoDb.Models",
            autoGeneratedKeyType: AutoGeneratedKeyType.Identity
        });

...

store.addEntityType(et);
store.registerEntityTypeCtor("TodoItem", null, todoItemInitializer);

その後、初期化子は期待どおりに機能し、ko.computed値が正しく認識されます。もちろん、これにより、使用するすべてのプロパティを宣言する必要があります。通常の操作とバインディングは、このコードが存在しなくても機能します。

于 2013-02-15T23:11:41.910 に答える