将BreezeJS与AngularJS一起使用会产生错误。例如,当使用'过滤器'在ng-repeat中,控制台报告:堆栈空间不足。
重现的步骤
<ul>
<div>
<input ng-model="query" type="search" placeholder="search" />
</div>
<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错误。
答案 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对象而不是“包裹”的微风实体。