在我的angularjs项目中,我需要在我的标签中使用ng-src和src属性来回走动。
某些图像是静态资源,永远不会更改(它们可能会有条件地显示),而其他图像是动态的并且取决于范围变量。
每当我觉得合适时,我可以使用ng-src和src的混合吗?
我问的是因为我曾经读过我在使用angularjs时应该总是使用ng-src,但我也担心我会创建非常不必要的绑定和手表... < / p>
答案 0 :(得分:3)
实际上源代码非常简单 https://github.com/angular/angular.js/blob/v1.2.7/src/ng/directive/booleanAttrs.js
ng-src将始终$观察您的属性。
// ng-src, ng-srcset, ng-href are interpolated
forEach(['src', 'srcset', 'href'], function(attrName) {
var normalized = directiveNormalize('ng-' + attrName);
ngAttributeAliasDirectives[normalized] = function() {
return {
priority: 99, // it needs to run after the attributes are interpolated
link: function(scope, element, attr) {
attr.$observe(normalized, function(value) {
if (!value)
return;
attr.$set(attrName, value);
// on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
// then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
// to set the property as well to achieve the desired effect.
// we use attr[attrName] value since $set can sanitize the url.
if (msie) element.prop(attrName, attr[attrName]);
});
}
};
};
});
至于$ observe,来自文档:
观察者函数将在下一个
$digest
期间调用一次 编译后。然后每当调用观察者时 插值变化。
或更简单,如果没有插值没有脏检查。 AFAIK,angular.js与(大量)绑定的所有性能问题都是在进行脏检查时。
//没有人注册属性插值函数,所以我们手动调用它
$watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {