2014-01-27 76 views
0

我有一个400KB的图片在我的范围内的数据网址。我正在使用<img ng-src='{{dataUrl}}'/>,它正在工作,但速度非常缓慢:我假设角正在检查每一帧相对于其本身的400kb值。 angularjs batarang确认我总运行时间的95%花费$观看{{dataUrl}}绑定一次角度...然后再次在每个事件

dataUrl CAN可以动态改变,但肯定不是每一帧 - 只有当用户选择一个新的图像。

如何在不使用变得如此昂贵的完整双向绑定功能的情况下将新的dataUrl发送到事件中的DOM上?

+0

我只是直接使用JavaScript来做到这一点。 –

+0

我认为你可能在这里认为简单是对的。感谢您的提醒! –

回答

2

的$表函数返回一个回调只是为了这一点。你只需要执行它就可以破坏观察者。

var watcher = $scope.$watch('data', function(newValue, oldValue) { 
if (newValue) {//you could do a isset here 

    watcher(); 
} 
}); 

重新观看。可能因对当前$范围的项目数是昂贵

if(!$scope.$$phase) { 
    $scope.$digest() 
} 
2

您可以使用bindonce - AngularJS的高性能一次性绑定,可以将结果显示为0个手表。

实施例:

<ul> 
<li bindonce ng-repeat="person in Persons"> 
    <a bo-href="'#/people/' + person.id"><img bo-src="person.imageUrl"></a> 
    <a bo-href="'#/people/' + person.id" bo-text="person.name"></a> 
    <p bo-class="{'cycled':person.generated}" bo-html="person.description"></p> 
</li></ul> 

或:

<div bindonce="Person" bo-title="Person.title"> 
<span bo-text="Person.firstname"></span> 
<span bo-text="Person.lastname"></span> 
<img bo-src="Person.picture" bo-alt="Person.title"> 
<p bo-class="{'fancy':Person.isNice}" bo-html="Person.story"></p> 

更新:通过建议

One time binding另一个为AngularJS宜兰Frumer

例子:

<ul> 
<li ng-repeat="user in users"> 
    <a once-href="user.profileUrl" once-text="user.name"></a> 
    <a once-href="user.profileUrl"><img once-src="user.avatarUrl"></a> 
    <div once-class="{'formatted': user.description}" once-bind="user.description"></div> 
</li></ul> 
+1

现在还有一个新的选择:https://github.com/tadeuszwojcik/angular-once –

+1

当Person.picture或user.avatarUrl实际上做了改变,你如何告诉这些指令更新? –

0

可以使用单向databiding,这样

<img ng-scr="{{::dataUrl}}"/> 

或者,如果您使用的是角版本大于1.3嵌入了一个绑定。你几乎可以在任何指令上使用它。 $ digest列表只会处理一次手表,在加载之后它们将被销毁。

相关问题