Commit 77a0aeb8 authored by Valentin Hervieu's avatar Valentin Hervieu

Merge pull request #266 from rabbitfang/options-expression-binding

feat(rzSliderOptions): Change rzSliderOptions to use expression binding
parents f02f74e4 018d93e1
/*! angularjs-slider - v2.8.0 - /*! angularjs-slider - v2.8.0 -
(c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> - (c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> -
https://github.com/angular-slider/angularjs-slider - https://github.com/angular-slider/angularjs-slider -
2016-02-09 */ 2016-02-16 */
rzslider { rzslider {
position: relative; position: relative;
display: inline-block; display: inline-block;
......
/*! angularjs-slider - v2.8.0 - /*! angularjs-slider - v2.8.0 -
(c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> - (c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> -
https://github.com/angular-slider/angularjs-slider - https://github.com/angular-slider/angularjs-slider -
2016-02-09 */ 2016-02-16 */
/*jslint unparam: true */ /*jslint unparam: true */
/*global angular: false, console: false, define, module */ /*global angular: false, console: false, define, module */
(function(root, factory) { (function(root, factory) {
...@@ -330,7 +330,7 @@ ...@@ -330,7 +330,7 @@
// Watchers (order is important because in case of simultaneous change, // Watchers (order is important because in case of simultaneous change,
// watchers will be called in the same order) // watchers will be called in the same order)
this.scope.$watch('rzSliderOptions', function(newValue, oldValue) { this.scope.$watch('rzSliderOptions()', function(newValue, oldValue) {
if (newValue === oldValue) if (newValue === oldValue)
return; return;
self.applyOptions(); self.applyOptions();
...@@ -394,7 +394,13 @@ ...@@ -394,7 +394,13 @@
* Read the user options and apply them to the slider model * Read the user options and apply them to the slider model
*/ */
applyOptions: function() { applyOptions: function() {
this.options = RzSliderOptions.getOptions(this.scope.rzSliderOptions); var sliderOptions;
if (this.scope.rzSliderOptions)
sliderOptions = this.scope.rzSliderOptions();
else
sliderOptions = {};
this.options = RzSliderOptions.getOptions(sliderOptions);
if (this.options.step <= 0) if (this.options.step <= 0)
this.options.step = 1; this.options.step = 1;
...@@ -1664,7 +1670,7 @@ ...@@ -1664,7 +1670,7 @@
scope: { scope: {
rzSliderModel: '=?', rzSliderModel: '=?',
rzSliderHigh: '=?', rzSliderHigh: '=?',
rzSliderOptions: '=?', rzSliderOptions: '&?',
rzSliderTplUrl: '@' rzSliderTplUrl: '@'
}, },
......
/*! angularjs-slider - v2.8.0 - (c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> - https://github.com/angular-slider/angularjs-slider - 2016-02-09 */ /*! angularjs-slider - v2.8.0 - (c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> - https://github.com/angular-slider/angularjs-slider - 2016-02-16 */
rzslider{position:relative;display:inline-block;width:100%;height:4px;margin:35px 0 15px 0;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}rzslider[disabled]{cursor:not-allowed}rzslider[disabled] .rz-pointer{cursor:not-allowed;background-color:#d8e0f3}rzslider span{position:absolute;display:inline-block;white-space:nowrap}rzslider .rz-base{width:100%;height:100%;padding:0}rzslider .rz-bar-wrapper{left:0;z-index:1;width:100%;height:32px;padding-top:16px;margin-top:-16px;box-sizing:border-box}rzslider .rz-bar-wrapper.rz-draggable{cursor:move}rzslider .rz-bar{left:0;z-index:1;width:100%;height:4px;background:#d8e0f3;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}rzslider .rz-bar.rz-selection{z-index:2;background:#0db9f0;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}rzslider .rz-pointer{top:-14px;z-index:3;width:32px;height:32px;cursor:pointer;background-color:#0db9f0;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}rzslider .rz-pointer:after{position:absolute;top:12px;left:12px;width:8px;height:8px;background:#fff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;content:''}rzslider .rz-pointer:hover:after{background-color:#fff}rzslider .rz-pointer.rz-active{z-index:4}rzslider .rz-pointer.rz-active:after{background-color:#451aff}rzslider .rz-bubble{bottom:16px;padding:1px 3px;color:#55637d;cursor:default}rzslider .rz-bubble.rz-selection{top:16px}rzslider .rz-bubble.rz-limit{color:#55637d}rzslider .rz-ticks{position:absolute;top:-3px;left:0;z-index:1;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:0;padding:0 11px;margin:0;list-style:none;box-sizing:border-box;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}rzslider .rz-ticks .tick{width:10px;height:10px;text-align:center;cursor:pointer;background:#d8e0f3;border-radius:50%}rzslider .rz-ticks .tick.selected{background:#0db9f0}rzslider .rz-ticks .tick .tick-value{position:absolute;top:-30px;transform:translate(-50%,0)}rzslider.vertical{position:relative;width:4px;height:100%;padding:0;margin:0 20px;vertical-align:baseline}rzslider.vertical .rz-base{width:100%;height:100%;padding:0}rzslider.vertical .rz-bar-wrapper{top:auto;left:0;width:32px;height:100%;padding:0 0 0 16px;margin:0 0 0 -16px}rzslider.vertical .rz-bar{bottom:0;left:auto;width:4px;height:100%}rzslider.vertical .rz-pointer{top:auto;bottom:0;left:-14px!important}rzslider.vertical .rz-bubble{bottom:0;left:16px!important;margin-left:3px}rzslider.vertical .rz-bubble.rz-selection{top:auto;left:16px!important}rzslider.vertical .rz-ticks{top:0;left:-3px;z-index:1;width:0;height:100%;padding:11px 0;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}rzslider.vertical .rz-ticks .tick{vertical-align:middle}rzslider.vertical .rz-ticks .tick .tick-value{top:auto;right:-30px;transform:translate(0,-28%)} rzslider{position:relative;display:inline-block;width:100%;height:4px;margin:35px 0 15px 0;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}rzslider[disabled]{cursor:not-allowed}rzslider[disabled] .rz-pointer{cursor:not-allowed;background-color:#d8e0f3}rzslider span{position:absolute;display:inline-block;white-space:nowrap}rzslider .rz-base{width:100%;height:100%;padding:0}rzslider .rz-bar-wrapper{left:0;z-index:1;width:100%;height:32px;padding-top:16px;margin-top:-16px;box-sizing:border-box}rzslider .rz-bar-wrapper.rz-draggable{cursor:move}rzslider .rz-bar{left:0;z-index:1;width:100%;height:4px;background:#d8e0f3;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}rzslider .rz-bar.rz-selection{z-index:2;background:#0db9f0;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}rzslider .rz-pointer{top:-14px;z-index:3;width:32px;height:32px;cursor:pointer;background-color:#0db9f0;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}rzslider .rz-pointer:after{position:absolute;top:12px;left:12px;width:8px;height:8px;background:#fff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;content:''}rzslider .rz-pointer:hover:after{background-color:#fff}rzslider .rz-pointer.rz-active{z-index:4}rzslider .rz-pointer.rz-active:after{background-color:#451aff}rzslider .rz-bubble{bottom:16px;padding:1px 3px;color:#55637d;cursor:default}rzslider .rz-bubble.rz-selection{top:16px}rzslider .rz-bubble.rz-limit{color:#55637d}rzslider .rz-ticks{position:absolute;top:-3px;left:0;z-index:1;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:0;padding:0 11px;margin:0;list-style:none;box-sizing:border-box;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}rzslider .rz-ticks .tick{width:10px;height:10px;text-align:center;cursor:pointer;background:#d8e0f3;border-radius:50%}rzslider .rz-ticks .tick.selected{background:#0db9f0}rzslider .rz-ticks .tick .tick-value{position:absolute;top:-30px;transform:translate(-50%,0)}rzslider.vertical{position:relative;width:4px;height:100%;padding:0;margin:0 20px;vertical-align:baseline}rzslider.vertical .rz-base{width:100%;height:100%;padding:0}rzslider.vertical .rz-bar-wrapper{top:auto;left:0;width:32px;height:100%;padding:0 0 0 16px;margin:0 0 0 -16px}rzslider.vertical .rz-bar{bottom:0;left:auto;width:4px;height:100%}rzslider.vertical .rz-pointer{top:auto;bottom:0;left:-14px!important}rzslider.vertical .rz-bubble{bottom:0;left:16px!important;margin-left:3px}rzslider.vertical .rz-bubble.rz-selection{top:auto;left:16px!important}rzslider.vertical .rz-ticks{top:0;left:-3px;z-index:1;width:0;height:100%;padding:11px 0;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}rzslider.vertical .rz-ticks .tick{vertical-align:middle}rzslider.vertical .rz-ticks .tick .tick-value{top:auto;right:-30px;transform:translate(0,-28%)}
\ No newline at end of file
This diff is collapsed.
...@@ -334,7 +334,7 @@ ...@@ -334,7 +334,7 @@
// Watchers (order is important because in case of simultaneous change, // Watchers (order is important because in case of simultaneous change,
// watchers will be called in the same order) // watchers will be called in the same order)
this.scope.$watch('rzSliderOptions', function(newValue, oldValue) { this.scope.$watch('rzSliderOptions()', function(newValue, oldValue) {
if (newValue === oldValue) if (newValue === oldValue)
return; return;
self.applyOptions(); self.applyOptions();
...@@ -398,7 +398,13 @@ ...@@ -398,7 +398,13 @@
* Read the user options and apply them to the slider model * Read the user options and apply them to the slider model
*/ */
applyOptions: function() { applyOptions: function() {
this.options = RzSliderOptions.getOptions(this.scope.rzSliderOptions); var sliderOptions;
if (this.scope.rzSliderOptions)
sliderOptions = this.scope.rzSliderOptions();
else
sliderOptions = {};
this.options = RzSliderOptions.getOptions(sliderOptions);
if (this.options.step <= 0) if (this.options.step <= 0)
this.options.step = 1; this.options.step = 1;
...@@ -1668,7 +1674,7 @@ ...@@ -1668,7 +1674,7 @@
scope: { scope: {
rzSliderModel: '=?', rzSliderModel: '=?',
rzSliderHigh: '=?', rzSliderHigh: '=?',
rzSliderOptions: '=?', rzSliderOptions: '&?',
rzSliderTplUrl: '@' rzSliderTplUrl: '@'
}, },
......
...@@ -11,8 +11,10 @@ ...@@ -11,8 +11,10 @@
h.createSlider = function(sliderObj) { h.createSlider = function(sliderObj) {
var template = ''; var template = '';
if (sliderObj.options) var optionsExpression = sliderObj.optionsExpression || 'slider.options';
template = '<rzslider rz-slider-model="slider.value" rz-slider-options="slider.options"></rzslider>'; if (sliderObj.options || sliderObj.optionsExpression)
template = '<rzslider rz-slider-model="slider.value" rz-slider-options="' +
optionsExpression + '"></rzslider>';
else else
template = '<rzslider rz-slider-model="slider.value"></rzslider>'; template = '<rzslider rz-slider-model="slider.value"></rzslider>';
h.initSlider(sliderObj, template); h.initSlider(sliderObj, template);
...@@ -20,9 +22,10 @@ ...@@ -20,9 +22,10 @@
h.createRangeSlider = function(sliderObj) { h.createRangeSlider = function(sliderObj) {
var template = ''; var template = '';
if (sliderObj.options) var optionsExpression = sliderObj.optionsExpression || 'slider.options';
if (sliderObj.options || sliderObj.optionsExpression)
template = '<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"' + template = '<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"' +
'rz-slider-options="slider.options"></rzslider>'; 'rz-slider-options="' + optionsExpression + '"></rzslider>';
else else
template = '<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"></rzslider>'; template = '<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"></rzslider>';
h.initSlider(sliderObj, template); h.initSlider(sliderObj, template);
......
...@@ -481,6 +481,36 @@ ...@@ -481,6 +481,36 @@
expect(helper.scope.slider.max).to.equal(100); expect(helper.scope.slider.max).to.equal(100);
}); });
}); });
describe('options expression specific - ', function() {
it('should safely handle null expressions', function() {
var sliderConf = {
value: 10,
optionsExpression: 'thisDoesntExist'
};
helper.createSlider(sliderConf);
helper.scope.$digest();
expect(helper.slider.step).to.equal(1);
});
it('should not cause an infinite $digest loop with an expression that always returns a new object', function() {
var sliderConf = {
value: 10,
options: function() {
return {
floor: 1,
ceil: 1000
};
},
optionsExpression: 'slider.options()'
};
helper.createSlider(sliderConf);
helper.scope.$digest();
expect(helper.slider.minValue).to.equal(1);
expect(helper.slider.maxValue).to.equal(1000);
});
});
}); });
}()); }());
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment