angularjs ng-class 在 html 来自对象 属性
angularjs ng-class on html from object property
我正在创建一个指令,您可以在其中传递不同类型的 html 元素并将它们注入 table。
但是有时我的用户可能需要在 ng-class 指令中添加某种表达式
例如检查以下内容:
$scope.element =
{
html: '<button type="button" ng-class="element.classExpression">My button</button>',
classExpression : "element.classExpressionDefault ? 'btn-success': 'btn-danger'",
classExpressionDefault: $scope.inactive,
}
HTML:
<span ng-bind-html-unsafe="element.html"> </span>
请注意以上代码无效!
上面代码的问题是表达式没有被计算,因此它丢失了。
所以我的问题是我该如何添加它,这可能吗?
要完成您想要做的事情,您可能需要即时注入 $compile 和 compile 元素。另一种选择是以稍微不同的方式传递选项,并以不同的方式配置您的 DOM 以做出反应。
JSON:
$scope.inputs = [{
type: 'text',
classComparisonValue: 'someClass', // omit perhaps for other logic on DOM?
model: 'myKey'
}]
还有你的DOM:
<div ng-repeat="input in inputs">
<input type="text" class="input.class"
ng-model="inputAnswer[input.model]"
ng-if="input.type == 'text"
ng-class="{ 'btn-danger': input.classComparisonValue,
'btn-success': !input.classComparisonValue">
// Add other input types here with ng-if
</div>
正如 Brant 在他的回答中已经暗示的那样,您可以从指令中编译 $scope.element
的 html 来评估 angular 表达式。
为此,您需要注入 $compile
服务并使用指令 $scope
在 element.html
:
上调用它
angular.module('ui.directives', []).directive('exampleDirective', ['$compile',
function ($compile) {
return {
restrict: 'E',
scope: { element: '=' },
template: '<span ng-bind-html-unsafe="element.html"></span>',
link: function ($scope, element, attrs, controller) {
$scope.element = {
html: 'I am an <code>HTML</code>string with <p style="color: {{element.color}}">color</p>',
color: 'red'
}
$scope.element.html = $compile($scope.element.html)($scope);
}
};
}]);
当然你可以通过使用指令的模板传入元素并定义父控制器:
$scope.element = {
html: 'I am an <code>HTML</code>string with <p style="color: {{element.color}}">color</p>',
color: 'red'
}
模板:
<example-directive element="element"></example-directive>
JSFiddle:http://jsfiddle.net/8fw1gbrt/
我正在创建一个指令,您可以在其中传递不同类型的 html 元素并将它们注入 table。
但是有时我的用户可能需要在 ng-class 指令中添加某种表达式
例如检查以下内容:
$scope.element =
{
html: '<button type="button" ng-class="element.classExpression">My button</button>',
classExpression : "element.classExpressionDefault ? 'btn-success': 'btn-danger'",
classExpressionDefault: $scope.inactive,
}
HTML:
<span ng-bind-html-unsafe="element.html"> </span>
请注意以上代码无效!
上面代码的问题是表达式没有被计算,因此它丢失了。
所以我的问题是我该如何添加它,这可能吗?
要完成您想要做的事情,您可能需要即时注入 $compile 和 compile 元素。另一种选择是以稍微不同的方式传递选项,并以不同的方式配置您的 DOM 以做出反应。
JSON:
$scope.inputs = [{
type: 'text',
classComparisonValue: 'someClass', // omit perhaps for other logic on DOM?
model: 'myKey'
}]
还有你的DOM:
<div ng-repeat="input in inputs">
<input type="text" class="input.class"
ng-model="inputAnswer[input.model]"
ng-if="input.type == 'text"
ng-class="{ 'btn-danger': input.classComparisonValue,
'btn-success': !input.classComparisonValue">
// Add other input types here with ng-if
</div>
正如 Brant 在他的回答中已经暗示的那样,您可以从指令中编译 $scope.element
的 html 来评估 angular 表达式。
为此,您需要注入 $compile
服务并使用指令 $scope
在 element.html
:
angular.module('ui.directives', []).directive('exampleDirective', ['$compile',
function ($compile) {
return {
restrict: 'E',
scope: { element: '=' },
template: '<span ng-bind-html-unsafe="element.html"></span>',
link: function ($scope, element, attrs, controller) {
$scope.element = {
html: 'I am an <code>HTML</code>string with <p style="color: {{element.color}}">color</p>',
color: 'red'
}
$scope.element.html = $compile($scope.element.html)($scope);
}
};
}]);
当然你可以通过使用指令的模板传入元素并定义父控制器:
$scope.element = {
html: 'I am an <code>HTML</code>string with <p style="color: {{element.color}}">color</p>',
color: 'red'
}
模板:
<example-directive element="element"></example-directive>
JSFiddle:http://jsfiddle.net/8fw1gbrt/