查看 ngRequired 指令,我发现它们没有使用隔离范围,但它们设法观察“required”属性并检查是否有更改(获取最终的 bool 表达式结果)
attr.$observe('required', function() {
validator(ctrl.$viewValue);
});
如果在 Controller 范围内我有一个名为 isRequired 的 bool 变量,我可以直接编写:
<input id="year"
type="text"
name="year"
data-ng-model="currentVehicleEdit.year"
data-ng-required="isRequired" />
我得到的表达式被评估为 true 或 false。
我在指令上尝试了相同的方法(下拉验证),但我得到的只是该属性的文本值。所以我必须输入这样的内容才能获得结果(“true”,“false”):
<select id="involvementType"
name="involvementType"
data-ng-model="currentVehicleEdit.involvementType"
data-ng-options="a.name for a in involvementTypes"
data-combocontainsinvalidselection="{{showForm}}"
>
</select>
如果我尝试以与 ngRequired (data-combocontainsinvalidselection="showForm") 中相同的方式使用它,我只会得到纯文本 ("showForm"),而不是计算的表达式。
关于我创建的指令代码:
mydirectives.directive('combocontainsinvalidselection', [
function () {
return {
require: "?ngModel",
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
var validator = function (value) {
if (attr.combocontainsinvalidselection == true && value.id==0) {
ctrl.$setValidity('combocontainsinvalidselection', false);
return;
} else {
ctrl.$setValidity('combocontainsinvalidselection', true);
return value;
}
};
ctrl.$formatters.push(validator);
ctrl.$parsers.unshift(validator);
attr.$observe('combocontainsinvalidselection', function () {
validator(ctrl.$viewValue);
});
}
};
}
]);
ng-required 指令如何设法对表达式求值?
最佳答案
您可以parse属性。首先,避免在标记中的 showForm
周围使用 {{}}
,然后在您的条件中使用 $parse
,如下所示:
if ( $parse(attr.combocontainsinvalidselection)(scope) == true && value.id==0) {
//some code
不要忘记将 $parse
注入(inject)指令声明中。
关于angularjs - attr.$observe 必需的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787009/