我有一个指令,它将根据值获得/设置一个元素。
当元素聚焦或模糊时,指令将更新布尔值。但是,有时我只想在满足条件时设置焦点并使用不可赋值的值,这会引发此错误:
Error: [$compile:nonassign] Expression '$last && !domain.url' used with directive 'focusWhen' is non-assignable!
WORKING DEMO HERE(检查控制台是否有错误)
我理解为什么它会抛出一个错误,但如何从指令内部检测不可赋值,然后阻止它附加焦点/模糊事件,这些事件试图在焦点改变时分配值?
以下是使用不可赋值的指令的示例用法。在这种情况下,如果它也是一个空值
,它会将焦点设置在转发器中的最后一个项目上<div ng-repeat="domain in domainList">
<input type="text" ng-model="domain.url" focus-when="$last && !domain.url"/>
</div>
这是指令代码;
testApp.directive("focusWhen", ["$timeout", function ($timeout) {
function getLink($scope, $element) {
$scope.$watch("focusWhen", function (val) {
//only focus when needed and when this element doesn't already have focus
if (val && $element[0] !== document.activeElement) {
//Small delay needed before we can get focus properly
$timeout(function () {
$element.focus();
});
}
});
$element.on("blur.focusWhen", function () {
if ($scope.focusWhen) {
$timeout(function () {
$scope.focusWhen = false;
});
}
});
$element.on("focus.focusWhen", function () {
if (!$scope.focusWhen) {
$timeout(function () {
$scope.focusWhen = true;
});
}
});
}
return {
restrict: "A",
scope: {
focusWhen: "="
},
link: getLink
};
}]);
答案 0 :(得分:1)
<强>更新强>
检测此方法的程序化方法(而不是另外一个属性)使用$parse
fn。这是检查和抛出错误的角度。它尝试解析双向绑定属性,如果它没有assign属性,则抛出错误。 ($parse($attrs['focusWhen']).assign)
。
旧答案:
如何再次指示是否要设置焦点值?
<input type="text" ng-model="domain.url" one-way="true" focus-when="$last && !domain.url"/>
$element.on("blur.focusWhen", function () {
if ($scope.focusWhen) {
$timeout(function () {
if (!$attr.oneWay) {
$scope.focusWhen = false;
}
});
}
});