mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-29 04:20:30 +00:00
174 lines
6.5 KiB
JavaScript
174 lines
6.5 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* @ngdoc directive
|
|
* @name ng.directive:ngBind
|
|
* @restrict AC
|
|
*
|
|
* @description
|
|
* The `ngBind` attribute tells Angular to replace the text content of the specified HTML element
|
|
* with the value of a given expression, and to update the text content when the value of that
|
|
* expression changes.
|
|
*
|
|
* Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
|
|
* `{{ expression }}` which is similar but less verbose.
|
|
*
|
|
* It is preferrable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
|
|
* displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
|
|
* element attribute, it makes the bindings invisible to the user while the page is loading.
|
|
*
|
|
* An alternative solution to this problem would be using the
|
|
* {@link ng.directive:ngCloak ngCloak} directive.
|
|
*
|
|
*
|
|
* @element ANY
|
|
* @param {expression} ngBind {@link guide/expression Expression} to evaluate.
|
|
*
|
|
* @example
|
|
* Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
|
|
<doc:example>
|
|
<doc:source>
|
|
<script>
|
|
function Ctrl($scope) {
|
|
$scope.name = 'Whirled';
|
|
}
|
|
</script>
|
|
<div ng-controller="Ctrl">
|
|
Enter name: <input type="text" ng-model="name"><br>
|
|
Hello <span ng-bind="name"></span>!
|
|
</div>
|
|
</doc:source>
|
|
<doc:scenario>
|
|
it('should check ng-bind', function() {
|
|
expect(using('.doc-example-live').binding('name')).toBe('Whirled');
|
|
using('.doc-example-live').input('name').enter('world');
|
|
expect(using('.doc-example-live').binding('name')).toBe('world');
|
|
});
|
|
</doc:scenario>
|
|
</doc:example>
|
|
*/
|
|
var ngBindDirective = ngDirective(function(scope, element, attr) {
|
|
element.addClass('ng-binding').data('$binding', attr.ngBind);
|
|
scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
|
|
// We are purposefully using == here rather than === because we want to
|
|
// catch when value is "null or undefined"
|
|
// jshint -W041
|
|
element.text(value == undefined ? '' : value);
|
|
});
|
|
});
|
|
|
|
|
|
/**
|
|
* @ngdoc directive
|
|
* @name ng.directive:ngBindTemplate
|
|
*
|
|
* @description
|
|
* The `ngBindTemplate` directive specifies that the element
|
|
* text content should be replaced with the interpolation of the template
|
|
* in the `ngBindTemplate` attribute.
|
|
* Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`
|
|
* expressions. This directive is needed since some HTML elements
|
|
* (such as TITLE and OPTION) cannot contain SPAN elements.
|
|
*
|
|
* @element ANY
|
|
* @param {string} ngBindTemplate template of form
|
|
* <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.
|
|
*
|
|
* @example
|
|
* Try it here: enter text in text box and watch the greeting change.
|
|
<doc:example>
|
|
<doc:source>
|
|
<script>
|
|
function Ctrl($scope) {
|
|
$scope.salutation = 'Hello';
|
|
$scope.name = 'World';
|
|
}
|
|
</script>
|
|
<div ng-controller="Ctrl">
|
|
Salutation: <input type="text" ng-model="salutation"><br>
|
|
Name: <input type="text" ng-model="name"><br>
|
|
<pre ng-bind-template="{{salutation}} {{name}}!"></pre>
|
|
</div>
|
|
</doc:source>
|
|
<doc:scenario>
|
|
it('should check ng-bind', function() {
|
|
expect(using('.doc-example-live').binding('salutation')).
|
|
toBe('Hello');
|
|
expect(using('.doc-example-live').binding('name')).
|
|
toBe('World');
|
|
using('.doc-example-live').input('salutation').enter('Greetings');
|
|
using('.doc-example-live').input('name').enter('user');
|
|
expect(using('.doc-example-live').binding('salutation')).
|
|
toBe('Greetings');
|
|
expect(using('.doc-example-live').binding('name')).
|
|
toBe('user');
|
|
});
|
|
</doc:scenario>
|
|
</doc:example>
|
|
*/
|
|
var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
|
|
return function(scope, element, attr) {
|
|
// TODO: move this to scenario runner
|
|
var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));
|
|
element.addClass('ng-binding').data('$binding', interpolateFn);
|
|
attr.$observe('ngBindTemplate', function(value) {
|
|
element.text(value);
|
|
});
|
|
};
|
|
}];
|
|
|
|
|
|
/**
|
|
* @ngdoc directive
|
|
* @name ng.directive:ngBindHtml
|
|
*
|
|
* @description
|
|
* Creates a binding that will innerHTML the result of evaluating the `expression` into the current
|
|
* element in a secure way. By default, the innerHTML-ed content will be sanitized using the {@link
|
|
* ngSanitize.$sanitize $sanitize} service. To utilize this functionality, ensure that `$sanitize`
|
|
* is available, for example, by including {@link ngSanitize} in your module's dependencies (not in
|
|
* core Angular.) You may also bypass sanitization for values you know are safe. To do so, bind to
|
|
* an explicitly trusted value via {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}. See the example
|
|
* under {@link ng.$sce#Example Strict Contextual Escaping (SCE)}.
|
|
*
|
|
* Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you
|
|
* will have an exception (instead of an exploit.)
|
|
*
|
|
* @element ANY
|
|
* @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
|
|
*
|
|
* @example
|
|
* Try it here: enter text in text box and watch the greeting change.
|
|
<doc:example module="ngBindHtmlExample" deps="angular-sanitize.js" >
|
|
<doc:source>
|
|
<script>
|
|
angular.module('ngBindHtmlExample', ['ngSanitize'])
|
|
|
|
.controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) {
|
|
$scope.myHTML = 'I am an <code>HTML</code>string with <a href="#">links!</a> and other <em>stuff</em>';
|
|
}]);
|
|
</script>
|
|
<div ng-controller="ngBindHtmlCtrl">
|
|
<p ng-bind-html="myHTML"></p>
|
|
</div>
|
|
</doc:source>
|
|
<doc:scenario>
|
|
it('should check ng-bind-html', function() {
|
|
expect(using('.doc-example-live').binding('myHTML')).
|
|
toBe('I am an <code>HTML</code>string with <a href="#">links!</a> and other <em>stuff</em>');
|
|
});
|
|
</doc:scenario>
|
|
</doc:example>
|
|
*/
|
|
var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {
|
|
return function(scope, element, attr) {
|
|
element.addClass('ng-binding').data('$binding', attr.ngBindHtml);
|
|
|
|
var parsed = $parse(attr.ngBindHtml);
|
|
function getStringValue() { return (parsed(scope) || '').toString(); }
|
|
|
|
scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {
|
|
element.html($sce.getTrustedHtml(parsed(scope)) || '');
|
|
});
|
|
};
|
|
}];
|