Javascript 无法读取属性'$应用';未定义的

Javascript 无法读取属性'$应用';未定义的,javascript,angularjs,Javascript,Angularjs,我通过互联网研究了这个普遍存在的错误,但我没有找到解决问题的办法 我有一个jQuery iframe post消息函数,它从不同的域接收字符串。当它获取字符串时,需要将其存储到Angular并保存到数据库。我遇到的问题是,试图更新angular以便识别更改 这是我的代码: .controller('jobOrderController', function(Jobs, socketio) { var vm = this; var myImage; $.receiveMes

我通过互联网研究了这个普遍存在的错误,但我没有找到解决问题的办法

我有一个jQuery iframe post消息函数,它从不同的域接收字符串。当它获取字符串时,需要将其存储到Angular并保存到数据库。我遇到的问题是,试图更新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”也会有同样的效果。但是它似乎没有被更新为角度。

我看到您正在使用以避免使用
$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
。非常感谢…我花了一段时间来应用您的代码,因为我必须在不同的脚本中更改不同的内容。但是是的,它可以工作