mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-19 12:01:07 +00:00
Added ng:disabled, ng:checked, ng:multiple, ng:readonly, ng:selected to markup.js.
Also added coresponding descriptions live examples and tests for each directive to be displayed on the website. Closes #351
This commit is contained in:
parent
c8ee00cb2b
commit
e6ee994764
4 changed files with 216 additions and 1 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
### New Features
|
### New Features
|
||||||
- Added prepend() to jqLite
|
- Added prepend() to jqLite
|
||||||
- Added ng:options directive (http://docs.angularjs.org/#!angular.directive.ng:options)
|
- Added ng:options directive (http://docs.angularjs.org/#!angular.directive.ng:options)
|
||||||
|
- Added ng:disabled, ng:selected, ng:checked, ng:multiple, ng:readonly directive.
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
|
||||||
|
|
@ -384,7 +384,8 @@ var REMOVE_ATTRIBUTES = {
|
||||||
'disabled':'disabled',
|
'disabled':'disabled',
|
||||||
'readonly':'readOnly',
|
'readonly':'readOnly',
|
||||||
'checked':'checked',
|
'checked':'checked',
|
||||||
'selected':'selected'
|
'selected':'selected',
|
||||||
|
'multiple':'multiple'
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* @workInProgress
|
* @workInProgress
|
||||||
|
|
|
||||||
163
src/markups.js
163
src/markups.js
|
|
@ -235,8 +235,171 @@ angularTextMarkup('option', function(text, textNode, parentElement){
|
||||||
* @param {template} template any string which can contain `{{}}` markup.
|
* @param {template} template any string which can contain `{{}}` markup.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @workInProgress
|
||||||
|
* @ngdoc directive
|
||||||
|
* @name angular.directive.ng:disabled
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
*
|
||||||
|
* The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
|
||||||
|
* <pre>
|
||||||
|
* <div ng:init="scope = { isDisabled: false }">
|
||||||
|
* <button disabled="{{scope.isDisabled}}">Disabled</button>
|
||||||
|
* </div>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* the HTML specs do not require browsers preserve the special attributes such as disabled.(The presense of them means true and absense means false)
|
||||||
|
* This prevents the angular compiler from correctly retrieving the binding expression.
|
||||||
|
* To solve this problem, we introduce ng:disabled.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
<doc:example>
|
||||||
|
<doc:source>
|
||||||
|
Click me to toggle: <input type="checkbox" name="checked"><br/>
|
||||||
|
<button name="button" ng:disabled="{{checked}}">Button</button>
|
||||||
|
</doc:source>
|
||||||
|
<doc:scenario>
|
||||||
|
it('should toggle button', function() {
|
||||||
|
expect(element('.doc-example-live :button').attr('disabled')).toBeFalsy();
|
||||||
|
input('checked').check();
|
||||||
|
expect(element('.doc-example-live :button').attr('disabled')).toBeTruthy();
|
||||||
|
});
|
||||||
|
</doc:scenario>
|
||||||
|
</doc:example>
|
||||||
|
*
|
||||||
|
* @element ANY
|
||||||
|
* @param {template} template any string which can contain '{{}}' markup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @workInProgress
|
||||||
|
* @ngdoc directive
|
||||||
|
* @name angular.directive.ng:checked
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* the HTML specs do not require browsers preserve the special attributes such as checked.(The presense of them means true and absense means false)
|
||||||
|
* This prevents the angular compiler from correctly retrieving the binding expression.
|
||||||
|
* To solve this problem, we introduce ng:checked.
|
||||||
|
* @example
|
||||||
|
<doc:example>
|
||||||
|
<doc:source>
|
||||||
|
Check me to check both: <input type="checkbox" name="master"><br/>
|
||||||
|
<input id="checkSlave" type="checkbox" ng:checked="{{master}}">
|
||||||
|
</doc:source>
|
||||||
|
<doc:scenario>
|
||||||
|
it('should check both checkBoxes', function() {
|
||||||
|
expect(element('.doc-example-live #checkSlave').attr('checked')).toBeFalsy();
|
||||||
|
input('master').check();
|
||||||
|
expect(element('.doc-example-live #checkSlave').attr('checked')).toBeTruthy();
|
||||||
|
});
|
||||||
|
</doc:scenario>
|
||||||
|
</doc:example>
|
||||||
|
*
|
||||||
|
* @element ANY
|
||||||
|
* @param {template} template any string which can contain '{{}}' markup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @workInProgress
|
||||||
|
* @ngdoc directive
|
||||||
|
* @name angular.directive.ng:multiple
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* the HTML specs do not require browsers preserve the special attributes such as multiple.(The presense of them means true and absense means false)
|
||||||
|
* This prevents the angular compiler from correctly retrieving the binding expression.
|
||||||
|
* To solve this problem, we introduce ng:multiple.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
<doc:example>
|
||||||
|
<doc:source>
|
||||||
|
Check me check multiple: <input type="checkbox" name="checked"><br/>
|
||||||
|
<select id="select" ng:multiple="{{checked}}">
|
||||||
|
<option>Misko</option>
|
||||||
|
<option>Igor</option>
|
||||||
|
<option>Vojita</option>
|
||||||
|
<option>Di</option>
|
||||||
|
</select>
|
||||||
|
</doc:source>
|
||||||
|
<doc:scenario>
|
||||||
|
it('should toggle multiple', function() {
|
||||||
|
expect(element('.doc-example-live #select').attr('multiple')).toBeFalsy();
|
||||||
|
input('checked').check();
|
||||||
|
expect(element('.doc-example-live #select').attr('multiple')).toBeTruthy();
|
||||||
|
});
|
||||||
|
</doc:scenario>
|
||||||
|
</doc:example>
|
||||||
|
*
|
||||||
|
* @element ANY
|
||||||
|
* @param {template} template any string which can contain '{{}}' markup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @workInProgress
|
||||||
|
* @ngdoc directive
|
||||||
|
* @name angular.directive.ng:readonly
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* the HTML specs do not require browsers preserve the special attributes such as readonly.(The presense of them means true and absense means false)
|
||||||
|
* This prevents the angular compiler from correctly retrieving the binding expression.
|
||||||
|
* To solve this problem, we introduce ng:readonly.
|
||||||
|
* @example
|
||||||
|
<doc:example>
|
||||||
|
<doc:source>
|
||||||
|
Check me to make text readonly: <input type="checkbox" name="checked"><br/>
|
||||||
|
<input type="text" ng:readonly="{{checked}}" value="I'm Angular"/>
|
||||||
|
</doc:source>
|
||||||
|
<doc:scenario>
|
||||||
|
it('should toggle readonly attr', function() {
|
||||||
|
expect(element('.doc-example-live :text').attr('readonly')).toBeFalsy();
|
||||||
|
input('checked').check();
|
||||||
|
expect(element('.doc-example-live :text').attr('readonly')).toBeTruthy();
|
||||||
|
});
|
||||||
|
</doc:scenario>
|
||||||
|
</doc:example>
|
||||||
|
*
|
||||||
|
* @element ANY
|
||||||
|
* @param {template} template any string which can contain '{{}}' markup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @workInProgress
|
||||||
|
* @ngdoc directive
|
||||||
|
* @name angular.directive.ng:selected
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* the HTML specs do not require browsers preserve the special attributes such as selected.(The presense of them means true and absense means false)
|
||||||
|
* This prevents the angular compiler from correctly retrieving the binding expression.
|
||||||
|
* To solve this problem, we introduce ng:selected.
|
||||||
|
* @example
|
||||||
|
<doc:example>
|
||||||
|
<doc:source>
|
||||||
|
Check me to select: <input type="checkbox" name="checked"><br/>
|
||||||
|
<select>
|
||||||
|
<option>Hello!</option>
|
||||||
|
<option id="greet" ng:selected="{{checked}}">Greetings!</option>
|
||||||
|
</select>
|
||||||
|
</doc:source>
|
||||||
|
<doc:scenario>
|
||||||
|
it('should select Greetings!', function() {
|
||||||
|
expect(element('.doc-example-live #greet').attr('selected')).toBeFalsy();
|
||||||
|
input('checked').check();
|
||||||
|
expect(element('.doc-example-live #greet').attr('selected')).toBeTruthy();
|
||||||
|
});
|
||||||
|
</doc:scenario>
|
||||||
|
</doc:example>
|
||||||
|
* @element ANY
|
||||||
|
* @param {template} template any string which can contain '{{}}' markup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
var NG_BIND_ATTR = 'ng:bind-attr';
|
var NG_BIND_ATTR = 'ng:bind-attr';
|
||||||
var SPECIAL_ATTRS = {};
|
var SPECIAL_ATTRS = {};
|
||||||
|
|
||||||
forEach('src,href,checked,disabled,multiple,readonly,selected'.split(','), function(name) {
|
forEach('src,href,checked,disabled,multiple,readonly,selected'.split(','), function(name) {
|
||||||
SPECIAL_ATTRS['ng:' + name] = name;
|
SPECIAL_ATTRS['ng:' + name] = name;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,56 @@ describe("markups", function(){
|
||||||
expect(sortedHtml(element)).toEqual('<a ng:bind-attr="{"href":"{{url}}"}"></a>');
|
expect(sortedHtml(element)).toEqual('<a ng:bind-attr="{"href":"{{url}}"}"></a>');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should bind disabled', function() {
|
||||||
|
compile('<button ng:disabled="{{isDisabled}}">Button</button>');
|
||||||
|
scope.isDisabled = false;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('disabled')).toBeFalsy();
|
||||||
|
scope.isDisabled = true;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('disabled')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should bind checked', function() {
|
||||||
|
compile('<input type="checkbox" ng:checked="{{isChecked}}" />');
|
||||||
|
scope.isChecked = false;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('checked')).toBeFalsy();
|
||||||
|
scope.isChecked=true;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('checked')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should bind selected', function() {
|
||||||
|
compile('<select><option value=""></option><option ng:selected="{{isSelected}}">Greetings!</option></select>');
|
||||||
|
scope.isSelected=false;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.children()[1].selected).toBeFalsy();
|
||||||
|
scope.isSelected=true;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.children()[1].selected).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should bind readonly', function() {
|
||||||
|
compile('<input type="text" ng:readonly="{{isReadonly}}" />');
|
||||||
|
scope.isReadonly=false;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('readOnly')).toBeFalsy();
|
||||||
|
scope.isReadonly=true;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('readOnly')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should bind multiple', function() {
|
||||||
|
compile('<select ng:multiple="{{isMultiple}}"></select>');
|
||||||
|
scope.isMultiple=false;
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('multiple')).toBeFalsy();
|
||||||
|
scope.isMultiple='multiple';
|
||||||
|
scope.$eval();
|
||||||
|
expect(element.attr('multiple')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
it('should bind src', function() {
|
it('should bind src', function() {
|
||||||
compile('<img ng:src="{{url}}" />');
|
compile('<img ng:src="{{url}}" />');
|
||||||
scope.url = 'http://localhost/';
|
scope.url = 'http://localhost/';
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue