aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets.js15
-rw-r--r--test/widgetsSpec.js69
2 files changed, 80 insertions, 4 deletions
diff --git a/src/widgets.js b/src/widgets.js
index 155b8c08..63ddaf36 100644
--- a/src/widgets.js
+++ b/src/widgets.js
@@ -43,6 +43,13 @@
* instance of angular.module.ng.$rootScope.Scope to set the HTML fragment to.
* @param {string=} onload Expression to evaluate when a new partial is loaded.
*
+ * @param {string=} autoscroll Whether `ng:include` should call {@link angular.module.ng.$autoScroll
+ * $autoScroll} to scroll the viewport after the content is loaded.
+ *
+ * - If the attribute is not set, disable scrolling.
+ * - If the attribute is set without value, enable scrolling.
+ * - Otherwise enable scrolling only if the expression evaluates to truthy value.
+ *
* @example
<doc:example>
<doc:source jsfiddle="false">
@@ -84,7 +91,9 @@ angularWidget('ng:include', function(element){
var compiler = this,
srcExp = element.attr("src"),
scopeExp = element.attr("scope") || '',
- onloadExp = element[0].getAttribute('onload') || ''; //workaround for jquery bug #7537
+ onloadExp = element[0].getAttribute('onload') || '', //workaround for jquery bug #7537
+ autoScrollExp = element.attr('autoscroll');
+
if (element[0]['ng:compiled']) {
this.descend(true);
this.directives(true);
@@ -123,7 +132,9 @@ angularWidget('ng:include', function(element){
if (childScope) childScope.$destroy();
childScope = useScope ? useScope : scope.$new();
compiler.compile(element)(childScope);
- $autoScroll();
+ if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
+ $autoScroll();
+ }
scope.$eval(onloadExp);
}
}).error(clearContent);
diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js
index 633ec0e0..e8ff4b27 100644
--- a/test/widgetsSpec.js
+++ b/test/widgetsSpec.js
@@ -55,7 +55,7 @@ describe('widget', function() {
});
- describe('ng:include', inject(function($rootScope, $compile) {
+ describe('ng:include', function() {
function putIntoCache(url, content) {
return function($templateCache) {
@@ -227,9 +227,74 @@ describe('widget', function() {
expect(log.join('; ')).toEqual('url2; url2'); // it's here twice because we go through at
// least two digest cycles
}));
- }));
+ describe('autoscoll', function() {
+ var autoScrollSpy;
+
+ function spyOnAutoScroll() {
+ return function($provide) {
+ autoScrollSpy = jasmine.createSpy('$autoScroll');
+ $provide.value('$autoScroll', autoScrollSpy);
+ };
+ }
+
+ function compileAndLink(tpl) {
+ return function($compile, $rootScope) {
+ $compile(tpl)($rootScope);
+ };
+ }
+
+ function changeTplAndValueTo(template, value) {
+ return function($rootScope, $browser) {
+ $rootScope.$apply(function() {
+ $rootScope.tpl = template;
+ $rootScope.value = value;
+ });
+ $browser.defer.flush();
+ };
+ }
+
+ beforeEach(inject(
+ spyOnAutoScroll(),
+ putIntoCache('template.html', 'CONTENT'),
+ putIntoCache('another.html', 'CONTENT')));
+
+
+ it('should call $autoScroll if autoscroll attribute is present', inject(
+ compileAndLink('<ng:include src="tpl" autoscroll></ng:include>'),
+ changeTplAndValueTo('template.html'), function() {
+ expect(autoScrollSpy).toHaveBeenCalledOnce();
+ }));
+
+
+ it('should call $autoScroll if autoscroll evaluates to true', inject(
+ compileAndLink('<ng:include src="tpl" autoscroll="value"></ng:include>'),
+ changeTplAndValueTo('template.html', true),
+ changeTplAndValueTo('another.html', 'some-string'),
+ changeTplAndValueTo('template.html', 100), function() {
+ expect(autoScrollSpy).toHaveBeenCalled();
+ expect(autoScrollSpy.callCount).toBe(3);
+ }));
+
+
+ it('should not call $autoScroll if autoscroll attribute is not present', inject(
+ compileAndLink('<ng:include src="tpl"></ng:include>'),
+ changeTplAndValueTo('template.html'), function() {
+ expect(autoScrollSpy).not.toHaveBeenCalled();
+ }));
+
+
+ it('should not call $autoScroll if autoscroll evaluates to false', inject(
+ compileAndLink('<ng:include src="tpl" autoscroll="value"></ng:include>'),
+ changeTplAndValueTo('template.html', false),
+ changeTplAndValueTo('template.html', undefined),
+ changeTplAndValueTo('template.html', null), function() {
+ expect(autoScrollSpy).not.toHaveBeenCalled();
+ }));
+ });
+ });
+
describe('a', function() {
it('should prevent default action to be executed when href is empty',
inject(function($rootScope, $compile) {