Javascript $watch不';如果我在link函数之外指定了一个作用域,则无法工作

Javascript $watch不';如果我在link函数之外指定了一个作用域,则无法工作,javascript,angularjs,Javascript,Angularjs,我刚开始开发一个Angular应用程序,它使用flot绘制一组数据。它对静态数据工作得很好,但是一旦我们将指令连接到mongo,我就必须按照教程来让它用于更新数据。因为一个特殊的原因,我度过了一段地狱般的时光: 这是我的指令HTML: <div class="panel-body" data-ng-controller="flotChartCtrl"> <div data-flot-line-chart data-data="revenueData.data" data-o

我刚开始开发一个Angular应用程序,它使用flot绘制一组数据。它对静态数据工作得很好,但是一旦我们将指令连接到mongo,我就必须按照教程来让它用于更新数据。因为一个特殊的原因,我度过了一段地狱般的时光:

这是我的指令HTML:

<div class="panel-body" data-ng-controller="flotChartCtrl">
  <div data-flot-line-chart data-data="revenueData.data" data-options="line1.options" style="width: 100%; height: 300px;"></div>
</div>
正如您在html中看到的,我正在使用
数据选项
属性将line1.options对象传递到指令中。当我只是使用静态数据,而没有使用
ng model
$watch
函数时,这就起作用了,
scope:{options:“=”}
赋值是正确的。然而,似乎每当我在
链接
之外的作用域上设置任何内容时,它都会破坏
$watch
$watch
始终接收未定义的
数据
。。。我的scope.options也未定义。在
$watch
函数
范围之外。选项
是正确的,但如果在实际绘制数据时无法使用它们,则这对我没有多大帮助

我不得不对
链接:
中的选项进行硬编码,并对外部范围分配进行注释。我需要创建一系列不同的图表,它们看起来都不一样。我不想为每一个都硬编码不同的选项,但目前我看不到任何其他方法来实现这一点。是否有某种方法可以从
$watch
函数中的HTML访问我的其他数据属性,而不会破坏所有内容

注意:我尝试了
attrs.options
,但这只给了我一个“line1.options”字符串,而不是实际的对象

编辑1:

根据ExpertSystem的建议更新了我的代码。不再使用
ng型号
范围
在$watch中仍然不可用:


您的指令应如下所示:

...
restrict: 'A',
scope: {
    data:    '=ngModel',
    options: '='
},
link: function(scope, elem, attrs){
    ...
    scope.$watch('data', function(newValue, oldValue) {
        ...
尽管在这里使用
ngModel
似乎是多余的



证明了
范围
确实是在
$watch
回调中定义的。

避免未来困难时期的提示:RTFM(并确保您使用UTFM):)相信我,我正在阅读手册,但我没有找到我需要的答案(或者,如果我找到了他们,我显然不理解他们)。不幸的是,我仍然有困难,所以如果你有一个解决方案而不是一个明显的评论,我很乐意听到。我在发布了解决方案后发布了评论:)对不起,我没有注意这个名字。认为是其他人:)这为我解决了在$watch中使用scope.data的问题,但$watch中仍然不存在
scope
,这意味着我无法访问$watch中的
scope.options
。。。这是我的主要问题。
scope
$watch
回调中绝对可用。请将您的确切代码(其中
范围
未定义)。这是我的确切代码。它告诉我范围没有定义。我愚蠢地意识到,
scope
$watch
中可能不可用,但在父链接函数中声明的变量是可用的,
scope
在那里,所以我只是分配
var options=scope.options
,这在我的
$watch
中起作用。感谢您的帮助。在发布的代码中,仍然没有任何对
范围的引用。我很高兴您找到了一个解决方法,但是
范围
$watch
回调中可用(例如,因为它是在父函数中定义的)。可能您使用的是
选项
,而不是
范围.选项
...
restrict: 'A',
scope: {
    data:    '=ngModel',
    options: '='
},
link: function(scope, elem, attrs){
    ...
    scope.$watch('data', function(newValue, oldValue) {
        ...