1

AngularJS で BreezeJS を使用すると、エラーが発生します。たとえば、ng-repeat で「filter」を使用すると、コンソール レポート: スタック領域が不足しています。

再現する手順

  1. Todo-Angular BreezeJS サンプルを取得し、VS 2012 で開きます。
  2. index.html の直前に追加します<ul>


    <div>
    <input ng-model="query" type="search" placeholder="search" />
    </div>

  1. 次のコードを li 要素の data-ng-repeat に追加します


    <li data-ng-repeat="item in items | filter:query">

filter:query は、入力のテキストに基づいてリストをフィルタリングする必要がありますが、そうではありません。IE 10 では、コンソールは「スタック領域が不足しています」と報告します。Chrome では、コンソールに「範囲エラー」が報告されます。

(anonymous function) angular.js:5582
(anonymous function) angular.js:4679
Scope.$digest angular.js:7739
Scope.$apply angular.js:7926
listener angular.js:11228
v.event.dispatch jquery-1.8.3.min.js:2
o.handle.u

angular.copy(src, dest); を使用する場合 src は BreezeJS によって作成されます。別の stack_overflow エラーが表示されます。

4

3 に答える 3

8

検索テキストをTodoItem のすべてのプロパティに一致させるよう Angular に要求しているため、これは機能しません。

Breeze エンティティのプロパティには、インスタンスを指すentityAspectというプロパティを持つ が含まれます。entityTodoItem

特定の比較を行うフィルター関数を使用する必要があります。これを試して:

Index.html

<div>
  <input data-ng-model="searchText" type="検索" placeholder="検索" />
</div>
<ul>
    <li data-ng-repeat="item in items | filter:itemFilter">
    ...など...

controller.js

$scope.searchText = "";

// 注意: これは頻繁に呼び出されます!
$scope.itemFilter = 関数 (todoItem) {
    var searchText = $scope.searchText;
    // 検索テキストがある場合は、説明で探します。そうでなければ真を返す
    searchText を返しますか?
        -1 != todoItem.Description.toLowerCase().indexOf(searchText.toLowerCase()) :
        真実;
};

私のマシンでは魅力のように動作します:)

ps:あなたの事故にangular.copy()は同じ原因があります...すべてのプロパティの深度コピーを行い、エンティティは循環参照を持つ傾向があります。

于 2013-01-31T22:09:20.893 に答える
2

わかりました、ナビゲーション プロパティを除外するカスタム フィルターを実装しました。現在受信している Breeze エンティティをフィルタリングするだけです。

(function () {
'use strict';

angular.module('appFilter', []).filter('breezeFilter', function () {

    function contains(searchString, searchTerm) {
        if (!searchString) return false;
        return searchString.toString().toLowerCase().indexOf(searchTerm.toLowerCase()) != -1;
    }

    function getKeys(entity) {
        var names = [];
        var properties = entity.entityAspect.extraMetadata.properties;
        for (var property in properties) { names.push(property); }
        return names;
    }

    function search(entity, searchTerm) {
        var found = false;
        if ("entityAspect" in entity) {
            var keys = getKeys(entity);
            for (var i = 0; i < keys.length && !found; i++) {
                if (keys[i].slice(-2) !== "Id") {
                    var obj = entity[keys[i]];

                    switch (typeof obj) {
                        case 'object':
                            if (obj && !('navigationProperty' in obj)) {
                                found = search(obj, searchTerm);
                            }
                            break;
                        case 'number':
                        case 'string':
                            found = contains(obj, searchTerm);
                            break;
                        case 'boolean':
                        default:
                    }
                }
            }
        }
        return found;
    }

    return function (breezeEntities, expression) {
        if (!expression || expression.length < 2) return breezeEntities;
        var filtered = [];
        angular.forEach(breezeEntities, function (entity) {
            if (search(entity, expression)) {
                filtered.push(entity);
            }
        });
        return filtered;
    }
});
})();

これが役立つことを願っています。

于 2014-05-15T13:34:48.587 に答える
0

私はちょうど同じ問題を抱えていたので、そよ風のクエリ射影、つまり「select」句を使用して解決しました。「ラップされた」微風エンティティとは対照的に、純粋な JavaScript オブジェクトを返します。

于 2013-11-27T19:52:10.367 に答える