带有过滤器和$http服务的Angularjs计时

带有过滤器和$http服务的Angularjs计时,angularjs,Angularjs,当我的应用程序加载时,我向angular注册了一个过滤器和一个服务。 但是过滤器试图在服务返回数据之前执行,因此“我的项目”集合在过滤器中狂吠。 我有一把小提琴,但我不知道是否可以在小提琴中使用$http,因为它是一个外部资源。这是我的 很抱歉,它实际上不起作用。它经历了很多。 我想我的问题是时机。我需要过滤器等待http响应,或者只是不“强制”自己 我现在得到的错误是“items is undefined”,因为这就是应用过滤器的地方。 在我尝试将http调用混搭到服务中之前,我确实做到了这一

当我的应用程序加载时,我向angular注册了一个过滤器和一个服务。 但是过滤器试图在服务返回数据之前执行,因此“我的项目”集合在过滤器中狂吠。 我有一把小提琴,但我不知道是否可以在小提琴中使用$http,因为它是一个外部资源。这是我的 很抱歉,它实际上不起作用。它经历了很多。 我想我的问题是时机。我需要过滤器等待http响应,或者只是不“强制”自己

我现在得到的错误是“items is undefined”,因为这就是应用过滤器的地方。 在我尝试将http调用混搭到服务中之前,我确实做到了这一点。但我觉得这是一种有棱角的方式,我“只想顺从”

当我的控制器触发时,它发出调用以获取数据:

eventApi.async().then(function () {
    $scope.eventCollection = eventApi.data();
});
但在返回之前,过滤器将应用于html:

 <tr ng:repeat="event in events  | myEventFilter:ddlFilter |
       orderBy:sort.column:sort.descending">


这里有一个更新的fiddle分支,它修复了几个缺失的依赖项(
eventApi
未注入控制器,
$timeout
未注入
eventApi
服务)。我的评论将基于以下代码:

这把小提琴成功地让我们看到了您发布的问题:“无法读取过滤器中未定义的属性‘长度’”。通常,过滤器在默认情况下应该能够处理空/未定义的值。我只需修改过滤器,如下所示:

返回函数(项目、eventFilterType){
var arrayToReturn=[];
如果(items==未定义)返回arrayToReturn;
// ...
}
这应该解决你的根本问题;小提琴现在运行没有错误,尽管它似乎不能正常工作;据我所知,这是因为您正在设置控制器的
if(live)
部分中的
$scope.eventCollection
而不是
$scope.events
。进行此更改会导致数据实际显示在视图中

但是,您可能会对Angular的另一个属性感兴趣:当您使用使用
$q
构建的承诺时,您可以将视图直接绑定到承诺,并且视图会将其视为您将其绑定到承诺的解析值。例如,您可以执行以下操作:

//在服务中
$timeout(函数(){

reffered.resolve(fakeEvents);//此外,它在所有尘埃落定后仍能工作。它最初只是抛出一系列错误,关于筛选器没有任何要处理的项,而不是$http,使用$timeout(例如,超时2秒)模拟JSFIDLE中的延迟。在超时回调中,将数据硬编码为从服务器返回的数据。发布该工作FIDLE,我们将看一看(因为您的FIDLE不仅仅存在$http问题)。以下是修复其他两个问题的FIDLE分支:(1)eventApi未被注入控制器和(2)主应用程序模块不依赖于chartApp模块。就是这样。VBAHole,仅供参考…当你添加评论并希望通知某人该评论时,请在评论中添加例如@Mark。然后该人会得到通知。我不知道你更新了小提琴。但布兰登已经很好地照顾了你:)请注意,SO将始终通知与问题或评论相关的人发表评论的位置。例如,即使我没有在您的用户名中使用@符号,您也会收到有关此评论的通知。难以置信!非常感谢。angular在工作时非常有趣,在不工作时也会让人心痛。但是y是难以置信的,每个人都非常有帮助。我想,这本身就是框架工作的直接反映。很高兴能提供帮助!我有过类似的经历,但一旦它点击它就很棒了!我在解析日期值时使用了上述技术:
if(value==未定义)return new date();return new date()(parseInt(value.substr(6));
自动承诺展开实际上刚刚从angular core中删除。@JeffHubbard谢谢,这实际上非常有趣,即使在这个问题的范围之外。我已经更新了答案。