Javascript 角度过滤器工作,但将输入视为未定义并抛出错误

Javascript 角度过滤器工作,但将输入视为未定义并抛出错误,javascript,angularjs,angularjs-filter,Javascript,Angularjs,Angularjs Filter,我写了一个过滤器,它似乎工作得很好,尽管我得到了以下错误 TypeError:无法读取未定义的属性“replaceAll” 过滤器将错误的相对URL替换为绝对URL。这是过滤器和标记 //located elsewhere String.prototype.replaceAll = function(s,r){ return this.split(s).join(r); } //located elsewhere var imgBase = '<img src="http://di

我写了一个过滤器,它似乎工作得很好,尽管我得到了以下错误

TypeError:无法读取未定义的属性“replaceAll”

过滤器将错误的相对URL替换为绝对URL。这是过滤器和标记

//located elsewhere
String.prototype.replaceAll = function(s,r){
    return this.split(s).join(r);
}
//located elsewhere
var imgBase = '<img src="http://discourse.mysite.com';

app.filter('prependImg_topic', function(){
  return function(cooked) {
    return cooked.replaceAll('<img src="//discourse.mysite.com', imgBase);
  }
})

我猜数据是异步加载的,如果是这种情况,那么过滤器抛出错误也就不足为奇了,因为它试图对(但)不存在的数据进行操作。您进行的检查
{{topic…}}
不能证明任何事情,因为如果数据最终会出现,它将打印数据(最好使用
console.log
)。
ng repeat
内的过滤器没有抛出任何错误的原因是
ng repeat
仅在有任何数据要迭代时才起作用,这意味着当
ng repeat
内的过滤器运行时,数据已经存在。
这也是为什么您应该始终以这样一种方式构造筛选器,即它们可以处理
未定义的
null
值,而无需抛出。

它们是异步加载的,但通过服务的承诺加载的,如果视图可以使用,则筛选器也可以使用它。实际上,我认为这是一种竞争条件,内部的
ngbindhtml
指令需要花费一些时间来解析html,因此过滤器无法访问它。ps我没有否决你的投票,谢谢你的帮助。是的,这是真的,它将是可用的,这意味着此刻
topic.post\u stream.posts[0].cooked
的值是
未定义的
,但这不会阻止过滤器对该值进行操作。由于该值是
undefined
atm,筛选器会抛出一个错误,因为
undefined
没有错误消息中所述的方法
replaceAll
。使用
{…}进行检查的原因
不抛出是因为$interpolate服务知道如何处理
未定义的值。这个想法很有趣。它工作的事实使我强烈认为DOM在过滤时可以访问该数据。非常感谢您的回答。您放入模板中的每个角度表达式都会在每个摘要中重新计算,因为过滤器通常用于此类表达式中,所以它们也会被执行。这就是它们经常运行的原因,因为消化液经常运行。
<div class="topic-post-body" ng-bind-html="topic.post_stream.posts[0].cooked | prependImg_topic "></div> "
<div class="post" ng-repeat="post in posts" ng-if="$index > 0">
     <div class="topic-post-body" ng-bind-html="post.cooked | prependImg_topic"></div>
</div>