![](/img/trans.png)
[英]AngularJS 1.5: scope.$watch inside link function doesn't update on model change
[英]$watch doesn't work if I specify a scope outside the link function
我刚开始使用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>
和javascript:
.directive("flotLineChart", [
function () {
return{
restrict: 'A',
scope: {
data: "=",
options: "="
},
link: function(scope, elem, attrs){
var chart = null;
// var options = { ... };
scope.$watch('data', function(data, oldData) {
if(!chart) {
chart = $.plot(elem, data, options);
elem.show();
} else {
chart.setData(data);
chart.setupGrid();
chart.draw();
}
});
}
};
}
])
正如您在html中看到的那样,我正在使用data-options
属性将line1.options对象传递到指令中。 当我只使用静态数据而不使用ng-model
或$watch
函数时,此方法有效且scope: { options: "=" }
分配是正确的。 但是,似乎每当我在link
外部的作用域上设置任何内容时,它都会破坏$watch
。 $watch
总是收到未定义的data
...,而我的scope.options也未定义。 在$watch
函数的scope.options
是正确的,但是如果在实际绘制数据时无法使用它们,那对我没有太大帮助。
我不得不求助于对link:
内部的选项进行硬编码link:
并注释掉外部作用域分配。 我有一堆需要创建的不同图表,所有这些图表看起来都不同。 我不愿意为每个选项都硬编码不同的选项,但是目前我看不到任何其他方法可以使这项工作实现。 有什么方法可以通过$watch
函数中的HTML访问我的其他数据属性,而不破坏所有内容?
注意:我尝试了attrs.options
,但这只是给我一个“ line1.options”字符串,而不是实际的对象。
编辑1:
根据ExpertSystem的建议更新了我的代码。 不再使用ng-model
。 $ watch scope
仍然不可用:
您的指令应如下所示:
...
restrict: 'A',
scope: {
data: '=ngModel',
options: '='
},
link: function(scope, elem, attrs){
...
scope.$watch('data', function(newValue, oldValue) {
...
ngModel
在这里ngModel
的使用似乎是多余的。
这个小提琴表明, scope
确实在$watch
回调中定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.