Javascript 无法读取属性'$应用';未定义的
我通过互联网研究了这个普遍存在的错误,但我没有找到解决问题的办法 我有一个jQuery iframe post消息函数,它从不同的域接收字符串。当它获取字符串时,需要将其存储到Angular并保存到数据库。我遇到的问题是,试图更新angular以便识别更改 这是我的代码:Javascript 无法读取属性'$应用';未定义的,javascript,angularjs,Javascript,Angularjs,我通过互联网研究了这个普遍存在的错误,但我没有找到解决问题的办法 我有一个jQuery iframe post消息函数,它从不同的域接收字符串。当它获取字符串时,需要将其存储到Angular并保存到数据库。我遇到的问题是,试图更新angular以便识别更改 这是我的代码: .controller('jobOrderController', function(Jobs, socketio) { var vm = this; var myImage; $.receiveMes
.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”也会有同样的效果。但是它似乎没有被更新为角度。我看到您正在使用以避免使用$scope
。
您只是忘记在控制器的开头声明vm(代表viewmodel):
var vm = this;
编辑:指南还说:
“考虑仅在需要时在控制器中使用$scope。例如
使用$emit、$broadcast或$emit发布和订阅事件时
$on。“
对于$apply
,您也需要显式使用$scope.$apply
,您可以这样做:
.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'
);
});
此
在Angular的控制器内工作方式不同。它并不总是与$scope
相同,$scope
是包含$apply
方法的对象。对于$apply
,您不能使用此方法$scope
和此
是不同的实例,因此此
无法访问$apply
检查代码段:
angular.module('myApp',[]).controller('MyCtrl',function($scope){
var vm=这个;
setTimeout(函数(){
$scope.$apply(函数(){
vm.text='Submit';
});
}, 0);
});代码>
{{ctrl.text}
对于$scope.foo
(如果您的controllerAs
设置为foo
),controllerAs
语法只是(当前)糖。因此,此
在本例中实际上将指向$scope.foo
,而不是$scope
,这就是您无法通过此
调用任何$scope
操作的原因。要使用其中任何一个,您必须显式使用$scope
以上答案都是关于如何解决短期问题的解决方案,即在控制器中使用$scope.$apply
老实说,这里的问题不是你不能使用$scope.$apply
——我不确定你到底想做什么,但Angular的一个主要规则是你必须通过Angular做任何事情<代码>$。receiveMessage
显然不是角度。将您的$.receiveMessage
包装到服务中;该服务还应处理$scope.$apply
。这将有助于减少代码重复,并使控制器对服务的实现不可知
可能已经存在这样一个库,它可以避免使用jQuery的繁重需求。更改.controller('jobOrderController',function(Jobs,socketio){
==>.controller('jobOrderController',function(vm,Jobs,socketio){
它给了我注入错误操作抱歉我忘了添加那一行,我现在对我的帖子进行了调整啊,我明白了,好吧,我想我会将所有内容替换为$scope当然,每次使用$scope都会很好是的,但这会杀死我的控制器,因为ctrler没有响应。好吧,我已经更新了答案。只需使用$s当调用$apply
时,使用cope
而不是vm
。非常感谢…我花了一段时间来应用您的代码,因为我必须在不同的脚本中更改不同的内容。但是是的,它可以工作