即使模型没有变化,如何强制 angular 到 re-bind/update
how to force angular to re-bind/update even there is no change in the model
好的——所以你可能在想为什么你想要这个,但我正在尝试使用 ng-html-bind 渲染一些 HTML 像这样(在 HAML 中):
#my-visualization-panel{'ng-bind-html' => 'htmlSource'}
htmlSource 有一些 html 使用 c3.js 可视化库呈现可视化。 htmlSource
看起来像这样
<script>
var MY_DATA = localStorage.getItem('MY_DATA');
c3.generate({
data: {
columns: MY_DATA
}
});
</script>
所以问题是我通过重新设置 localStorage['MY_DATA']
来更新可视化。但是,虽然 MY_DATA
引用的数据可能会更改,但实际 htmlSource
不会更改,因此视图无法更新。
有没有办法强制视图更新,即使模型表面上没有更新?
您可以使用 $scope 对象的 apply
方法:
$scope.apply();
如果您仍然遇到正在进行摘要的错误,您还可以使用 $timeout 对象,它将 运行 下一个摘要周期中的函数:
$timeout(function() {
//code
});
根据您在此答案中的最新评论,您似乎正在寻找 $scope.watch 方法。您可以添加一个观察者,以便在发生变化时收听。
我还是建议更改 HTML。例如
<script>
var MY_DATA = localStorage.getItem('MY_DATA');// 2482486284968248968 (hash of my_data, guid, or serial number)
c3.generate({
data: {
columns: MY_DATA
}
});
</script>
这将允许您的脚本直接按照您的预期运行,而无需进行大范围的更新或修改。即使你 "force a refresh",如果 HTML 没有改变,Angular 也不会重新执行你的脚本。
另一种可能性是在您的 angular 控制器/指令中调用 localStorage.getItem('MY_DATA')
,而不是间接希望 Angular 会通过 HTML 为您 运行更新。这似乎是您正在寻找的那种控制方式。
我花了大约 2-3 个小时来解决这个问题。最后我找到了解决方案
$scope.$apply();
好的——所以你可能在想为什么你想要这个,但我正在尝试使用 ng-html-bind 渲染一些 HTML 像这样(在 HAML 中):
#my-visualization-panel{'ng-bind-html' => 'htmlSource'}
htmlSource 有一些 html 使用 c3.js 可视化库呈现可视化。 htmlSource
看起来像这样
<script>
var MY_DATA = localStorage.getItem('MY_DATA');
c3.generate({
data: {
columns: MY_DATA
}
});
</script>
所以问题是我通过重新设置 localStorage['MY_DATA']
来更新可视化。但是,虽然 MY_DATA
引用的数据可能会更改,但实际 htmlSource
不会更改,因此视图无法更新。
有没有办法强制视图更新,即使模型表面上没有更新?
您可以使用 $scope 对象的 apply
方法:
$scope.apply();
如果您仍然遇到正在进行摘要的错误,您还可以使用 $timeout 对象,它将 运行 下一个摘要周期中的函数:
$timeout(function() {
//code
});
根据您在此答案中的最新评论,您似乎正在寻找 $scope.watch 方法。您可以添加一个观察者,以便在发生变化时收听。
我还是建议更改 HTML。例如
<script>
var MY_DATA = localStorage.getItem('MY_DATA');// 2482486284968248968 (hash of my_data, guid, or serial number)
c3.generate({
data: {
columns: MY_DATA
}
});
</script>
这将允许您的脚本直接按照您的预期运行,而无需进行大范围的更新或修改。即使你 "force a refresh",如果 HTML 没有改变,Angular 也不会重新执行你的脚本。
另一种可能性是在您的 angular 控制器/指令中调用 localStorage.getItem('MY_DATA')
,而不是间接希望 Angular 会通过 HTML 为您 运行更新。这似乎是您正在寻找的那种控制方式。
我花了大约 2-3 个小时来解决这个问题。最后我找到了解决方案
$scope.$apply();