Javascript 在我的指令之后发生的,所以我不';我没有价值
我有一个带有ng bind指令的div元素:Javascript 在我的指令之后发生的,所以我不';我没有价值,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我有一个带有ng bind指令的div元素: <div ng-bind="sometext"></div> 我有一个指令,它获取一个元素,检查其值/文本,并根据内容向元素添加颜色。我是这样使用这个指令的: <div ng-bind="sometext" my-directive></div> 问题是,在执行指令时,div上没有值或文本,因为ng bind尚未发生。 我正在使用element.text()获取文本。 你知道如何在我的指令中
<div ng-bind="sometext"></div>
我有一个指令,它获取一个元素,检查其值/文本,并根据内容向元素添加颜色。我是这样使用这个指令的:
<div ng-bind="sometext" my-directive></div>
问题是,在执行指令时,div上没有值或文本,因为ng bind尚未发生。我正在使用element.text()获取文本。
你知道如何在我的指令中使用文本吗 您可以使用scope.$watch链接函数并查看模型更改。每次值更改时,ng bind将启动,您的指令也将启动,独立于bg bind指令,并且仅依赖于模型本身
很抱歉,在回答您的问题时,我无法将示例代码作为im显示在平板电脑上。在
ngBind
绑定其值之前,您的指令可能正在运行-您的指令和ngBind
都是优先级为0的,因此可以先运行,稍后再进行详细说明-但让我们看一看,看看问题的根源:
var ngBindDirective = ngDirective(function(scope, element, attr) {
element.addClass('ng-binding').data('$binding', attr.ngBind);
scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
element.text(value == undefined ? '' : value);
});
});
我们看到,ngBind
不会立即更新DOM,而是在ngBind
属性上放置了一个监视。因此,在下一个$digest
周期运行该手表之前,元素不会被更新(这就是$timeout
工作的原因)
因此,一个选项是模拟ngBind
并将您自己的手表放在其属性上-然后,只要ngBind
结果发生变化,您就会得到更新:
angular.module('myApp').directive('myDirective', function() {
return {
priority: 1,
link: function(scope,element,attrs) {
scope.$watch(attrs.ngBind, function(newvalue) {
console.log("element ",element.text());
});
}
};
});
您会注意到我将优先级设置为1。您确实需要确保此指令的watch位于watch队列中的ngBind
watch之后。这将确保元素首先由ngBind
更新
默认情况下,指令的链接函数运行post link,因此注意:
首先编译具有更高数字优先级的指令。
前链接功能也按优先级顺序运行,但后链接功能除外
函数按相反的顺序运行
因此,由于ngBind
的优先级为0,超过0的任何值都将确保指令的手表位于ngBind
手表之后
编辑2 另一个选项是使用
ng class
或ng style
更改文本的颜色。那么您根本不必创建新的指令
原始答案
我根本不依赖于ng bind
指令。。。在我看来,这似乎要干净得多
<div ng-bind="someModel" my-directive="someModel"></div>
这样,即使元素上没有ng bind
(例如,如果使用大括号),也可以使用指令
及
您可以找到有关scope.$watch(…)
和attrs.$observe()
之间差异的更多信息
编辑
既然您的指令基本上是在ngbind
指令之后对DOM进行变异,为什么不一起跳过ngbind
<div my-directive="{{someModel}}"></div>
您需要更改指令的优先级,以便它在ng bind之后运行。我从来没有做过任何有优先权的事情,所以我不能给你太多的帮助。@MattGreer:我以为解决办法会是这样的。我看过angularJS代码,没有优先考虑ng绑定。我需要设置比ng bind更少的优先级,因为我希望我的指令最后运行。你知道吗?上周我遇到了一个类似的问题,我通过在部分代码周围包装
$timeout
,解决了这个问题,所以在绑定发生后的下一个摘要周期对它进行评估。我对这个解决方案不太满意,但也许它能满足您的需要。@Naor您是否尝试过在指令中添加优先级:1
?只是出于好奇,也许真的那么简单?回答得好!用几句话解释为什么在ngBind的$watch
之后,更高的优先级会导致注册在postLink
函数中的$watch
启动:)@ExpertSystem谢谢!好的观点-我更新了一点。除非AngularJS团队更改ng bind
的优先级。我强烈建议您不要将代码的行为建立在变异ng bind
@rtcherry的结果的基础上,我理解您的担忧。但它并没有真正改变ng bind的结果,它只是在他们的结果后面添加了一块手表。当然,Angular可以改变任何东西-但它会被标记为破坏性的改变-他们确实会发布优先级(例如使ngRepeat
s1000优先级突出)。您的代码不会改变结果,但最初的问题是读取文本值,然后更改颜色。我使用了watch属性值。这是最合乎逻辑的做法。谢谢!
<div my-directive="someModel">{{someModel}}</div>
<div ng-bind="someModel" my-directive="{{someModel}}"></div>
angular.module('myApp').directive('myDirective', function() {
return {
link: function(scope, element, attrs) {
attrs.$observe('myDirective', function(interpolatedValue) {
// Your Code here...
});
}
};
});
<div my-directive="{{someModel}}"></div>
angular.module('myApp').directive('myDirective', function() {
return {
link: function(scope, element, attrs) {
attrs.$observe('myDirective', function(interpolatedValue) {
if (interpolatedValue) {
// Modify interpolatedValue if necessary...
}
element.text(interpolatedValue == undefined ? '' : interpolatedValue);
});
}
};
});