Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在我的指令之后发生的,所以我不';我没有价值_Javascript_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript 在我的指令之后发生的,所以我不';我没有价值

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()获取文本。 你知道如何在我的指令中

我有一个带有ng bind指令的div元素:

<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);
            });           
        }
    };      
});