我通过互联网研究了这个流行的错误,我找不到解决问题的方法。
我所拥有的是一个jQuery iframe post消息函数,它接收来自不同域的字符串。当它获得字符串时,它需要将它存储到Angular并保存到数据库。我遇到的麻烦是,尝试更新角度以识别变化。
所以这是我的代码:
.controller('jobOrderController', function(Jobs, socketio) {
var vm = this;
var myImage;
$.receiveMessage(
function(e) {
myImage = e.data;
vm.$apply(function() {
vm.orderData.guideImage = e.data
});
},
'http://aaa.com'
);
vm.createOrders = function() {
vm.message = '';
Jobs.createOrders(vm.orderData)
.success(function(data) {
vm.orderData = '';
vm.message = data.message;
});
};
})
$.receiveMessage
将侦听传入的字符串数据,然后在收到它时应将其保存到我的“controller,vm”。我知道我的消息正在收到,因为我可以提醒他们。
我知道我错了,但我读到的一切都是使用$scope.apply
,所以我认为使用“this”会有同样的效果。但它似乎没有更新到角度。
答案 0 :(得分:1)
我发现您使用john papa's guideline来避免使用$scope
。
你只是忘了在控制器的开头声明vm(代表viewmodel):
var vm = this;
编辑:指南也说:
"仅在需要时考虑在控制器中使用$ scope。例如 使用$ emit,$ broadcast或者发布和订阅事件时 $对"
对于$apply
,您还需要明确使用$scope.$apply
答案 1 :(得分:0)
你可以这样做:
.controller('jobOrderController', function($scope, Jobs, socketio) {
var vm = this;
$.receiveMessage(
function(e) {
myImage = e.data;
$scope.$apply(function() {
vm.orderData.guideImage = e.data
});
},
'http://aaa.com'
);
});
this
在Angular控制器内的工作方式不同。它并不总是与$scope
相同,而$scope
是包含$apply
方法的对象。
答案 2 :(得分:0)
对于$apply
,您无法使用this
。 $scope
和this
是不同的实例,因此this
无法访问$apply
。
检查代码段:
angular.module('myApp', []).controller('MyCtrl', function($scope) {
var vm = this;
setTimeout(function() {
$scope.$apply(function() {
vm.text = 'Submit';
});
}, 0);
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="MyCtrl as ctrl">
<button>{{ctrl.text}}</button>
</div>
&#13;
答案 3 :(得分:0)
controllerAs
语法只是$scope.foo
的当前糖(如果您的controllerAs
设置为foo
)。因此,在此实例中this
实际上指向$scope.foo
而不是$scope
,这就是为什么您将无法调用任何$scope
通过this
的行动。要使用其中任何一种,您必须明确使用$scope
。
以上答案都回答了如何解决短期问题的解决方案,即您在控制器中使用$scope.$apply
。
老实说,这里的问题并不是你不能使用$scope.$apply
- 我不确定你想要做什么,但Angular的主要规则之一就是你必须做所有事情通过Angular; $.receiveMessage
肯定是不 Angular。将您的$.receiveMessage
包裹到服务中;该服务还应该处理$scope.$apply
。这将有助于减少代码重复,并使您的控制器与服务的实现无关。
可能已经有一个存在的库可以避免使用jQuery的大量需求。