2

Breeze.JS を作成して、angular の http サービスを ajax 呼び出しに利用しようとしています。ドキュメント(http://www.breezejs.com/documentation/customizing-ajax)に従って適用しました。しかし、うまくいきません。

さらにブリーズのソースコードを確認したところ、次のことがわかりました。

fn.executeQuery = function (mappingContext) {

    var deferred = Q.defer();
    var url = mappingContext.getUrl();

    OData.read({
            requestUri: url,
            headers: { "DataServiceVersion": "2.0" }
        },
        function (data, response) {
            var inlineCount;
            if (data.__count) {
                // OData can return data.__count as a string
                inlineCount = parseInt(data.__count, 10);
            }
            return deferred.resolve({ results: data.results, inlineCount: inlineCount });
        },
        function (error) {
            return deferred.reject(createError(error, url));
        }
    );
    return deferred.promise;
};

http サービスについて何もせずに、単に OData.read を呼び出します。したがって、OData は組み込みの ajax を利用します。上記のコードでは、Breeze.JS の ajax をカスタマイズする方法がわかりません。

4

2 に答える 2

1

$http サービスをシミュレートする手っ取り早いハッキング

今日、この問題に遭遇しました。Angular のサービスではなく外部の datajs AJAX メソッドが使用されるため$http(Ward が説明したように)、Breeze クエリはダイジェストをトリガーせず、モデルは更新されません。

外部から角度への変更と同様に、簡単な解決策は、クエリからの割り当てを$scope.$apply()関数でラップすることです。ただし、これはアプリをすぐに混乱させるため、お勧めできません。

私は、これまでのところうまくいくように見える、迅速で汚いハックを思いつきました:

  1. 私は、dataContextすべての Breeze クエリをカプセル化しgetCustomers()、などのメソッドを公開するサービスを持っています ( Breeze サイトgetProducts()の例に触発されました)。
  2. これらのデータ アクセス メソッドのいずれかが完了すると (つまり、promise が解決されると)、triggerAngularDigest()メソッドを呼び出します。
  3. このメソッドは単純$rootScope.$apply()に 内で呼び出します$timeout()
  4. これ$timeout()により、Angular は次のティックでダイジェストを実行します。つまり、Breeze クエリからのデータがモデルに割り当てられた後です。
  5. を使用するときと同じように、すべてのモデルが更新されます。コントローラー$httpを呼び出す必要はありません。$apply()

簡易版:

function dataContext($rootScope, $timeout, breeze) {

    // config of entity manager etc snipped

    return {
        getCustomers: function () {
            return breeze.EntityQuery.from('Customers')
                .using(manager)
                .execute()
                .then(function(data) {
                    triggerAngularDigest(); // <-- this is the key
                    return data;
                });
        }
    };

    function triggerAngularDigest() {
        $timeout(function() {
            $rootScope.$apply();
        }, 0);
    }
}

myApp.factory('dataContext', dataContext);

それで:

// some controller in your app
dataContext.getCustomers().then(function(data) {
    scope.customers = data;
}); 
于 2014-11-07T13:55:55.497 に答える