Javascript Angularjs$scope.$apply采用新语法

Javascript Angularjs$scope.$apply采用新语法,javascript,angularjs,html,Javascript,Angularjs,Html,我在angular中使用了新语法: app.controller('NewLocationController', function() { var newLocation = this; ... } 及 我想在新语法中使用$scope.$apply()。我如何使用它?您仍然可以将值注入“新语法”控制器。这本书的所有内容仍然适用。例如: app.controller('NewLocationController', function($scope) { var newLocation

我在angular中使用了新语法:

app.controller('NewLocationController', function() {
  var newLocation = this;
...
}


我想在新语法中使用
$scope.$apply()
。我如何使用它?

您仍然可以将值注入“新语法”控制器。这本书的所有内容仍然适用。例如:

app.controller('NewLocationController', function($scope) {
  var newLocation = this;
  ...
}

我认为您必须以“传统方式”注入$scope,如果您想使用$apply,$digest,。。。(从$rootScope继承的)。 用法应该是:

app.controller('NewLocationController', function($scope)   
{
  $scope.$apply(...);
}
或者如果您想使用此语法

app.controller('NewLocationController', function($scope)   
{
 this.$apply=$scope.$apply;
 this.$apply(...);
}
此处,
仅适用于您在控制器本身中定义的属性和方法。见文件:

我们可以使用以下方法将方法和属性直接绑定到控制器上


如果您可以在应用程序中包含
jQuery
,那么您可以尝试从DOM元素获取范围。我们需要jQuery的原因是没有jQuery的
angular.element
无法使用属性选择器查找元素

app.controller('NewLocationController', function() {
  var newLocation = this;
  $scope = angular.element('[ng-controller^="NewLocationController"]').scope();

  $scope.name = 'from controller without scope';

  if (!$scope.$$phase) {
    $scope.$apply(function () { 
      newLocation.name = "Hello" 
    });
  }
});
确保在页面上包含AngularJS之前包含jQuery


Demo

我通常建议您避免在控制器中使用
$scope.apply()
,而是尝试重构代码并将该逻辑放入指令中。话虽如此,我理解有时这是必要的,如果您需要在“controller as”样式中使用$scope,您仍然可以将其注入控制器,而不会出现任何问题

app.controller('NewLocationController', function($scope) {      
}

您是否尝试过:
newLocation.$apply()
?@Mikey,是的,但它不起作用新语法不会改变
$scope
的工作方式。与直接向
$scope
添加内容不同,您可以有效地将其添加到
$scope。newLocation
,仅此而已
$apply()
仍然是
$scope
的成员。使用
$scope.$apply()
的原因是,我做了一些更改,但没有在view@SuperHornet哦,哇,真的吗?我刚刚回忆起,您仍然必须在控制器中注入$scope作为依赖项。您使用的是哪个版本的angular?我尝试了newLocation。$apply(),但它返回:
Uncaught TypeError:newLocation。$apply不是一个函数
@SuperHornet,这正是Rob告诉您的。不,您必须使用$scope。$apply或将函数分配给控制器。$apply=$scope。$apply!我认为“旧语法”看起来干净多了,我同意。但是如果OP想要使用我不推荐的新语法,那么这只是获取作用域的另一种方式。使用jquery是没有意义的!
app.controller('NewLocationController', function() {
  var newLocation = this;
  $scope = angular.element('[ng-controller^="NewLocationController"]').scope();

  $scope.name = 'from controller without scope';

  if (!$scope.$$phase) {
    $scope.$apply(function () { 
      newLocation.name = "Hello" 
    });
  }
});
app.controller('NewLocationController', function($scope) {      
}