Javascript 如何使用ControllerAs语法手动更新AngularJS视图?

Javascript 如何使用ControllerAs语法手动更新AngularJS视图?,javascript,angularjs,Javascript,Angularjs,我正在开发一个带有可排序、可停靠、可浮动小部件的仪表板。我使用的一个控件在DOM的底部,在关闭body标记之前,以HTML的形式生成浮动小部件。这将有效地从生成窗口控件的控制器范围中删除在窗口控件中执行的操作 我正在使用可用的controllerAs语法开发这个仪表板控制器,但我不知道当外部组件执行影响视图数据的操作时,如何使用此语法有效地更新视图 注意:这不是我面临的唯一一个迫使我手动更新主视图的问题。页面上的其他地方也有执行影响视图的操作的指令 理想情况下,我永远不必手动更新视图,因为我将使

我正在开发一个带有可排序、可停靠、可浮动小部件的仪表板。我使用的一个控件在DOM的底部,在关闭
body
标记之前,以HTML的形式生成浮动小部件。这将有效地从生成窗口控件的控制器范围中删除在窗口控件中执行的操作

我正在使用可用的
controllerAs
语法开发这个仪表板控制器,但我不知道当外部组件执行影响视图数据的操作时,如何使用此语法有效地更新视图

注意:这不是我面临的唯一一个迫使我手动更新主视图的问题。页面上的其他地方也有执行影响视图的操作的指令

理想情况下,我永远不必手动更新视图,因为我将使用影响摘要循环的内置角度命令中发生的所有命令,但这不是我的选项

所以。。。如果我使用的是
$scope
,我将能够简单地执行以下操作:

$scope.$digest

但是,我如何使用控制器获得与之相同的效果呢

var vm = this;
vm.array = [item, item];
vm.something = something;

//External something changes something on a vm.variable

vm.update! //How??

使用“as”可以定义在视图中引用控制器范围的方式

因此:

<body ng-controller="MainCtrl">
  <p>Hello {{name}}!</p>
</body>

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
});

因此,基本上您应该能够调用
this.$digest
this.$apply
,就像您在
$scope
上所做的那样

更新

在做了一些搜索之后,我认为正确的解决方案应该是使用
$scope.apply()
$scope.digest()

主要资源:

你提出了同样的问题,作者重播:

在这种情况下,您可以使用$scope.$apply(),只需为 这就是目的(仍然将vm用于其他一切)。然而,如果你 从使用ajax切换到使用Angular的$http,这样就不需要了 调用$apply,因为angular的$http会为您这样做。我就是这么想的 推荐

我发现的其他资源:


尝试在$scope中执行更新。$apply块如下所示:

$scope.apply(function() {
    vm.something = some_new_value;
});

为避免“摘要已在进行中”错误,请使用
var vm=this将其包装在
$timeout

然后
vm.$digest()导致错误:
对象不支持属性或方法“$digest”
。在这种情况下,我认为您需要使用
$scope.$digest()
$scope.$apply()
。看看它在哪里解释了
$scope
injection我以前读过那篇文章,我认为它特别提到了$scope injection,指的是手表或广播,这让我觉得可能有一种方法可以在没有范围的情况下应用更新。无论如何都应该有。
这个
不等于
$scope
,所以我仍然认为正确的解决方案是
$scope.$apply()
,但由于我不是100%确定,我将等待其他答复。我还为我的答案添加了几个链接以帮助调查。使用controllerAs时,必须将
$scope
本身注入控制器函数。然后您可以正常使用
$scope.$apply()
<body ng-controller="MainCtrl as main">
  <p>Hello {{main.name}}!</p>
</body>
app.controller('MainCtrl', function($scope) {
  this.name = 'World';
});
$scope.apply(function() {
    vm.something = some_new_value;
});