我有以下指令,它告訴我,是否我想要使用的圖像已成功或沒有加載:
return {
restrict: 'A',
scope: {
imageLoad: '@'
},
link: function(scope, element, attrs) {
attrs.$observe('imageLoad', function (url) {
var deferred = $q.defer(),
image = new Image();
image.onerror = function() {
deferred.resolve(false);
};
image.onload = function() {
deferred.resolve(true);
};
image.src = url;
return deferred.promise;
});
}
};
所有我然後要做的就是兩個簡單的測試,測試image.onerror
和image.onload
但我似乎只是進入的誤差函數,這是我到目前爲止有:
compileDirective = function() {
var element = angular.element('<div data-image-load="http://placehold.it/350x150"></div>');
$compile(element)(scope);
$rootScope.$digest();
return element;
};
beforeEach(inject(function (_$compile_, _$rootScope_) {
$compile = _$compile_;
$rootScope = _$rootScope_;
scope = $rootScope.$new();
}));
it('should do something', function() {
var compiledElement, isolatedScope;
compiledElement = compileDirective();
isolatedScope = compiledElement.isolateScope();
expect(true).toBe(true);
});
顯然這個測試通過,因爲它只是希望真的是不過,就覆蓋範圍而言,這是成立的他的onerror函數,所以我不知何故需要測試deferred.promise應該返回false。
所以最終一個問題的兩個部分,我如何得到deferred.resolve的結果呢?
其次我如何進入的onload功能?
我已經繞了一看,看到添加以下的一些建議:
element[0].setAttribute('imageLoad','http://placehold.it/350x150');
$compile(element)(scope);
element.trigger('imageLoad');
和離開data-image-load=""
空白,但沒有似乎存有任何僥倖,任何建議將是巨大的。
這不涉及到你的問題,但有你使用'ATTRS什麼特殊原因$ observe'?現在你可以刪除它並用'scope.imageLoad'替換'url'。現在,傳遞給'$ observe'的匿名函數只返回承諾,但沒有人能夠查看結果。指令的要點是什麼?它應該如何使用? – tasseKATT
@tasseKATT基本上,實際應用程序中的圖像路徑將是動態的,因此可能會更改,因此需要重新觸發。承諾確保它被加載,如果失敗我會提供一個後備圖像,我已經省略了上面例子中的一些代碼,在那裏我使用element.css(背景圖像)設置了一個後備圖像 – gardni
因此,指令本身就是唯一一個對承諾的結果作出反應的人? – tasseKATT