Skip to content

Commit 73da93d

Browse files
Jay Proulxajoslin
Jay Proulx
authored andcommitted
feat(ionContent): don't wrap in a .scroll element if scroll="false"
Fixes #841. Closes #897.
1 parent cf92d6c commit 73da93d

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

Diff for: js/ext/angular/src/directive/ionicContent.js

+11-6
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ angular.module('ionic.ui.content', ['ionic.ui.scroll'])
4848
* with {@link ionic.service:$ionicScrollDelegate}.
4949
* @param {boolean=} padding Whether to add padding to the content.
5050
* of the content. Defaults to true on iOS, false on Android.
51-
* @param {boolean=} scroll Whether to allow scrolling of content. Defaults to true.
51+
* @param {boolean=} scroll Whether to allow scrolling of content. Defaults to true. Note: scroll="false" removes the .scroll child element on element compilation, not on scope change
5252
* @param {boolean=} overflow-scroll Whether to use overflow-scrolling instead of
5353
* Ionic scroll.
5454
* @param {boolean=} has-bouncing Whether to allow scrolling to bounce past the edges
@@ -66,12 +66,17 @@ function($timeout, $controller, $ionicBind) {
6666
require: '^?ionNavView',
6767
scope: true,
6868
compile: function(element, attr) {
69+
var innerElement;
70+
6971
element.addClass('scroll-content');
7072

71-
//We cannot transclude here because it breaks element.data() inheritance on compile
72-
var innerElement = angular.element('<div class="scroll"></div>');
73-
innerElement.append(element.contents());
74-
element.append(innerElement);
73+
if (attr.scroll != 'false') {
74+
//We cannot use normal transclude here because it breaks element.data()
75+
//inheritance on compile
76+
innerElement = angular.element('<div class="scroll"></div>');
77+
innerElement.append(element.contents());
78+
element.append(innerElement);
79+
}
7580

7681
return { pre: prelink };
7782
function prelink($scope, $element, $attr, navViewCtrl) {
@@ -104,7 +109,7 @@ function($timeout, $controller, $ionicBind) {
104109

105110
if (angular.isDefined($attr.padding)) {
106111
$scope.$watch($attr.padding, function(newVal) {
107-
innerElement.toggleClass('padding', !!newVal);
112+
(innerElement || $element).toggleClass('padding', !!newVal);
108113
});
109114
}
110115

Diff for: js/ext/angular/test/directive/ionicContent.unit.js

+32-5
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,41 @@ describe('Ionic Content directive', function() {
6060
});
6161
});
6262

63-
it('should add padding classname', function() {
63+
it('should have no scroll element when scroll="false"', function() {
64+
var element = compile('<ion-content scroll="false"></ion-content>')(scope);
65+
var scroll = element.find('.scroll');
66+
67+
expect(scroll.length).toBe(0);
68+
});
69+
70+
it('should add padding classname to scroll element', function() {
6471
var element = compile('<ion-content padding="shouldPad"></ion-content>')(scope);
65-
var scrollElement = element.find('.scroll');
66-
expect(scrollElement.hasClass('padding')).toEqual(false);
72+
var scroll = element.find('.scroll');
73+
74+
// by default, ion-content should have a scroll element, and the scroll element should not be padded
75+
expect(scroll.hasClass('padding')).toEqual(false);
76+
expect(element.hasClass('padding')).toEqual(false);
77+
6778
element.scope().$apply('shouldPad = true');
68-
expect(scrollElement.hasClass('padding')).toEqual(true);
79+
expect(scroll.hasClass('padding')).toEqual(true);
80+
expect(element.hasClass('padding')).toEqual(false);
81+
6982
element.scope().$apply('shouldPad = false');
70-
expect(scrollElement.hasClass('padding')).toEqual(false);
83+
expect(scroll.hasClass('padding')).toEqual(false);
84+
expect(element.hasClass('padding')).toEqual(false);
85+
86+
});
87+
88+
// keep scroll=false && padding tests separate as we don't handle a recompile yet when scroll changes.
89+
it('should add padding classname to scroll-content element', function() {
90+
var element = compile('<ion-content padding="shouldPad" scroll="false"></ion-content>')(scope);
91+
92+
// when ion-content is not scrollable, there will be no scroll element, the padding should be added to ion-content itself.
93+
element.scope().$apply('shouldPad = false');
94+
expect(element.hasClass('padding')).toEqual(false);
95+
96+
element.scope().$apply('shouldPad = true');
97+
expect(element.hasClass('padding')).toEqual(true);
7198
});
7299

73100
it('Should set start x and y', function() {

0 commit comments

Comments
 (0)