Javascript angularjs只会被调用一次

Javascript angularjs只会被调用一次,javascript,angularjs,Javascript,Angularjs,我正在使用窗口对象和延迟,以便将一些在创建控制器时不可用的内容注入控制器。在我第一次调用它时,它工作得很好。then方法执行得很好。但是当我以后调用它的时候.then方法并没有触发。这是什么原因造成的 app.factory('fromoutside', function ($window, $q, $rootScope) { var deferred = $q.defer(); $window.injectIntoAngularWorld = function (obj) {

我正在使用窗口对象和延迟,以便将一些在创建控制器时不可用的内容注入控制器。在我第一次调用它时,它工作得很好。then方法执行得很好。但是当我以后调用它的时候.then方法并没有触发。这是什么原因造成的

app.factory('fromoutside', function ($window, $q, $rootScope) {
    var deferred = $q.defer();

    $window.injectIntoAngularWorld = function (obj) {
        deferred.resolve(obj);
        $rootScope.$apply();
    };

    return deferred.promise;
});

这是一把小提琴,有点像我在做什么,但不完全是。它会抛出关于应用程序已经在进行中的错误,但是我得到了很多错误,并且经常忽略它们

对于这类事情,使用事件可能会更好

承诺是为了解决问题,然后就实现了。这意味着他们是一次性交易

以下是我的建议:

//把它放在你的跑步区。 app.runfunction$rootScope$window{ $window.foo=函数数据{ $rootScope.$broadcast'fooCalled',数据; }; }; //在控制器中使用$on。 app.controller'MyCtrl',函数$scope{ $scope.$on'fooCalled',functionevent,data{ $scope.fooData=数据; }; };
这只是一种方法,但它应该有效,而且相当干净。如果您想创建一个服务来监听事件并设置它,您可以。

您可能会更好地使用事件来完成这类事情

承诺是为了解决问题,然后就实现了。这意味着他们是一次性交易

以下是我的建议:

//把它放在你的跑步区。 app.runfunction$rootScope$window{ $window.foo=函数数据{ $rootScope.$broadcast'fooCalled',数据; }; }; //在控制器中使用$on。 app.controller'MyCtrl',函数$scope{ $scope.$on'fooCalled',functionevent,data{ $scope.fooData=数据; }; };
这只是一种方法,但它应该有效,而且相当干净。如果您想创建一个服务来收听事件并进行设置,您可以。

我也遇到了同样的问题,每次我都通过defin de deferred来修复它,我想对您来说应该是这样的:

$window.injectIntoAngularWorld = function (obj) {
    var deferred = $q.defer();
    deferred.resolve(obj);
    $rootScope.$apply();
};

我也有同样的问题,每次我都会通过defin de deferred来解决,我想对你来说应该是这样的:

$window.injectIntoAngularWorld = function (obj) {
    var deferred = $q.defer();
    deferred.resolve(obj);
    $rootScope.$apply();
};


为什么你说RunReach方法不会再次被触发?我不应该在结果中看到4,5,6而不是1,2,3吗?为什么你要添加延迟到$window而不是将服务注入到你的控制器中?顺便说一句:$digest已经在进行中,这不是一个正常的错误,绝对是一个你不应该忽略的错误。这表明你的代码有问题。也许这一个让它更清楚。这个例子是对我试图做的事情的过度简化。在我的现实世界示例中,“外部”组件是另一个调用该窗口方法的js文件。为什么你说该方法Runnear不会再次被触发?我不应该在结果中看到4,5,6而不是1,2,3吗?为什么你要添加延迟到$window而不是将服务注入到你的控制器中?顺便说一句:$digest已经在进行中,这不是一个正常的错误,绝对是一个你不应该忽略的错误。这表明你的代码有问题。也许这一个让它更清楚。这个例子是对我试图做的事情的过度简化。在我的真实示例中,“外部”组件是另一个调用该窗口方法的js文件。无论是$rootScope.$emit还是$rootScope.broadcast。你能帮我吗。澄清一下,我的错,应该是$broadcast。。。因为它向下延伸到所有子作用域。我的“运行块”是什么?目标是将非角度代码中的值注入控制器。触发事件的运行代码没有$I got的概念。非常感谢,这是一个很好的解决方案。我认为行应该是$scope.$on'fooCalled',functionevent,data,无论是$rootScope.$emit还是$rootScope.broadcast。你能帮我吗。澄清一下,我的错,应该是$broadcast。。。因为它向下延伸到所有子作用域。我的“运行块”是什么?目标是将非角度代码中的值注入控制器。触发事件的运行代码没有$I got的概念。非常感谢,这是一个很好的解决方案。我认为行应该是$scope.$on'fooCalled',functionevent,data