将BreezeJS与AngularJS一起使用时出错

时间:2013-01-31 09:24:26

标签: angularjs breeze

将BreezeJS与AngularJS一起使用会产生错误。例如,当使用'过滤器'在ng-repeat中,控制台报告:堆栈空间不足。

重现的步骤

  1. 采取Todo-Angular BreezeJS样本&在VS 2012中开放。
  2. 在index.html中添加<ul>
  3. 之前
    
    
        <div>
        <input ng-model="query" type="search" placeholder="search" />
        </div>
    
    
    1. 将以下代码添加到li元素
    2. 上的data-ng-repeat
      
      
          <li data-ng-repeat="item in items | filter:query">
      
      

      filter:query应根据输入中的文本过滤列表 但它并没有。 在IE 10中,控制台报告&#34;用完堆栈空间&#34;。 在Chrome中,控制台会报告&#34;范围错误&#34;:

      (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错误。

3 个答案:

答案 0 :(得分:8)

这是行不通的,因为你要求Angular将搜索文本与 TodoItem的每个属性相匹配。

Breeze实体的属性包括entityAspect,它有一个名为entity的属性,指向TodoItem实例......并且在你周围堆栈溢出(双关语)

您需要使用进行特定比较的过滤器功能。试试这个:

Index.html

<div>
  <input data-ng-model="searchText" type="Search" placeholder="search" />
</div>
<ul>
    <li data-ng-repeat="item in items | filter:itemFilter">
    ... etc. ...

controller.js

$scope.searchText = "";

// Beware: this is called a lot!
$scope.itemFilter = function (todoItem) {
    var searchText = $scope.searchText;
    // if there is search text, look for it in the description; else return true
    return searchText ?
        -1 != todoItem.Description.toLowerCase().indexOf(searchText.toLowerCase()) :
        true;
};

在我的机器上像魅力一样工作:)

p.s。:你与angular.copy()发生的事故具有相同的原因......它会对每个属性进行深度复制,而实体往往具有循环引用。

答案 1 :(得分:2)

好的,我实现了一个自定义过滤器,它排除了导航属性。它只是过滤当前收到的微风实体。

(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;
    }
});
})();

我希望这会有所帮助。

答案 2 :(得分:0)

我遇到了同样的问题,我通过在微风中使用查询投影来解决,即“select”子句。它返回纯JavaScript对象而不是“包裹”的微风实体。