1

解決しました!ノックアウトの問題(間違ったバインディング)でした。しかし、コード全般 (dataservice、viewmodel など) について議論したり、コメントしたりするのが好きな人がいるかもしれません。

Breeze サンプルを作成しようとしました。ここでは、データベース レコードを 1 つ ( fetchEntityByKeyを使用して) 取得し、更新用に表示してから、保存ボタンを使用して、変更をデータベースに書き戻します。それを機能させる方法がわかりませんでした。

私はデータサービス(「クラス」)とビューモデル(「クラス」)を持ち、ビューモデルをノックアウトでビューにバインドしようとしてまし

誰かがサンプルを提供したり、ヒントを提供してくれたりすると、とても感謝しています。

ありがとう、ハリー

 var dataservice = (function () {
     var serviceName = "/api/amms/";
     breeze.NamingConvention.camelCase.setAsDefault();
     var entityManager = new breeze.EntityManager(serviceName);

     var dataservice = {
         serviceName: serviceName,
         entityManager: entityManager,
         init: init,
         saveChanges: saveChanges,
         getLocation: getLocation
     };

     return dataservice;

     function init() {
         return getMetadataStore();
     }

     function getMetadataStore() {
         return entityManager.fetchMetadata()
             .then(function (result) { return dataservice; })
             .fail(function () { window.alert("fetchMetadata:fail"); })
             .fin(function () { });
     }

     function saveChanges() {
         return entityManager.saveChanges()
             .then(function (result) { return result; })
             .fail(function () { window.alert("fetchEntityByKey:fail"); })
             .fin(function () { });
     }

     function getLocation() {
         return entityManager.fetchEntityByKey("LgtLocation", 1001, false)
             .then(function (result) { return result.entity; })
             .fail(function () { window.alert("fetchEntityByKey:fail"); })
             .fin(function () { });
     }
 })();

 var viewmodel = (function () {
     var viewmodel = {
         location: null,
         error: ko.observable(""),
         init: init,
         saveChanges: null
     };

     return viewmodel;

     function init() {
         return dataservice.init().then(function () {
             viewmodel.saveChanges = dataservice.saveChanges;
             return getLocation();
         })
     }

     function getLocation() {
         return dataservice.getLocation().then(function (result) {
             return viewmodel.location = result;
         })
     }
 })();

 viewmodel.init().then(function () {
     ko.applyBindings(viewmodel);
 });
4

1 に答える 1

0

解決してよかったです。何もしないコールバックを大量に追加したことに気付かずにはいられません。そうする理由が思いつかない。また、明示的にメタデータを要求しました。しかし、あなたが呼び出したように、それは常にサーバーに送られるfetchEntityByKeyため、への呼び出しは暗黙的にそれを行います。

また、呼び出し元 (ViewModel など) が独自の失敗ハンドラーを追加できるように、データ サービス内の失敗コールバックでエラーを再スローすることをお勧めします。再スローがなければ、呼び出し元の失敗コールバックはそれを聞きません (Q promise 機構は、最初の失敗ハンドラーが問題を「解決」したかのように動作します)。

したがって、データサービスは次のように削減できます。

var データサービス = (関数 () {
     Breeze.NamingConvention.camelCase.setAsDefault();
     var serviceName = "/api/amms/";
     var entityManager = 新しいそよ風.EntityManager(serviceName);

     var データサービス = {
         serviceName: serviceName, // なぜこれをエクスポートするのですか?
         エンティティマネージャー: エンティティマネージャー,
         saveChanges: saveChanges,
         getLocation: getLocation
     };

     データサービスを返します。

     関数 saveChanges() {
         entityManager.saveChanges() を返す
             .fail(関数 () {
                 window.alert("saveChanges に失敗しました: " + error.message);
                 エラーをスローします。// 呼び出し元に聞こえるように再スローします
             }))
     }

     関数 getLocation() {
         return entityManager.fetchEntityByKey("LgtLocation", 1001, false)
             .then(関数 (結果) { return result.entity; })
             .fail(関数 () {
                 window.alert("fetchEntityByKey に失敗しました: " + error.message);
                 エラーをスローします。// 呼び出し元に聞こえるように再スローします
             }))
     }
 })();

私はこれをあまり作りたくない。たぶん、あなたは私たちにもっと実質的なものの簡素化されたバージョンを与えています. しかし、あなた (または読者) がこれらの方法が常に必要であると考えている場合のために、そうではないことを明確にしたいと思います。

于 2013-03-04T16:15:57.377 に答える