Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据另一个非角度JS文件中的全局变量更新角度$scope变量_Javascript_Jquery_Angularjs - Fatal编程技术网

Javascript 如何根据另一个非角度JS文件中的全局变量更新角度$scope变量

Javascript 如何根据另一个非角度JS文件中的全局变量更新角度$scope变量,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,如何根据另一个非JS Angular文件中的全局变量更新Angular$scope变量?我正在使用jQuery插件生成一些值。我想将此值连接到控制器中的$scope变量。然而,这个值是不断变化的,我不认为我的$scope变量会随着非角度变量的变化而自动更新。做这件事的好方法是什么?谢谢 通过将全局变量包装到函数中,可以在全局变量上使用$watch。在控制器的链接功能中,添加以下内容: $scope.$watch( function() { return globalVar

如何根据另一个非JS Angular文件中的全局变量更新Angular$scope变量?我正在使用jQuery插件生成一些值。我想将此值连接到控制器中的$scope变量。然而,这个值是不断变化的,我不认为我的$scope变量会随着非角度变量的变化而自动更新。做这件事的好方法是什么?谢谢

通过将全局变量包装到函数中,可以在全局变量上使用
$watch
。在控制器的
链接
功能中,添加以下内容:

$scope.$watch(
    function() {
        return globalVar;
    },
    function(newValue, oldValue) {
        // Global var changed! Do stuff.
        $scope.scopeVar = newValue;
    });
AngularJS不断轮询或检查第一个函数的返回值,该函数返回全局变量。这在每个摘要循环中执行多次

当值更改时,它调用第二个函数,即更改的事件处理程序。您可以在此处添加处理更改的逻辑。为了方便起见,更改处理程序同时传入旧值和新值


在这种情况下,我只是用更改的全局值设置一个范围变量。

如果全局变量在angujarjs之外更新,一个可能的解决方案是@metacubed提出的,但它有一个问题,即如果没有其他操作执行的摘要循环,变量将不会得到更新

因此,我可以提出的另一个解决方案是使用基于时间间隔的方法(由于不断执行摘要循环,因此成本可能会很高),如

var-app=angular.module('my-app',[],function(){})
app.controller('AppController',函数($scope,$interval){
$scope.mycounter=计数器;
$interval(函数(){
$scope.mycounter=计数器;
}, 1000);
$scope.something=function(){}
})
var计数器=0;
setInterval(函数(){
计数器++;
}, 500);

{{mycounter}}
做点什么

间隔解决方案似乎有效,但正如@Arun-p-johny所说,可能会有很多性能成本

我建议另一种解决方法:“仅当变量发生变化时才调用作用域的digist循环”

看到这个了吗

假设第一个子对象是您正在使用的范围,则此操作有效。。(在您的应用程序中可能不是这样),因此可能需要解决让rootscope()执行emit或在rootscope中设置变量的问题

或者我推荐一个更好更优雅的解决方案。。将外部库带到angular上下文(创建包装器),对我来说似乎是更好的解决方案

var-app=angular.module('my-app',[],function(){})
app.controller('AppController',函数($scope,$rootScope){
$scope.mycounter=计数器;
$rootScope.$on('updateOuter',函数(e,d){
控制台日志('d',d);
$scope.mycounter=d;
$scope.$apply();
});
$scope.something=function(){}
});
var updateDigest=函数(参数){
var appElement=document.querySelector(“[ng app=my app]”);
var appScope=angular.element(appElement.scope();
var rootScope=appScope;
rootScope.$emit('updateOuter',参数);
};
var计数器=0;
setInterval(函数(){
计数器++;
更新最大值(计数器);
}, 500);

{{mycounter}}

no。。它不会。。我认为一种选择是使用基于区间的解决方案,它必须用全局变量更新scope变量value@ArunPJohny您可以使用$watch的函数形式来实现这一点。有关详细信息,请参阅我的答案。@metacubed那么当值更改时,谁将触发摘要循环…@metacubed yes。。。手表将在下一个摘要周期被其他动作触发。你在使用什么样的插件?该值是否绑定到某个元素?或者它只是更新一个全局变量?看看-如果你保持理想,什么都不会发生。。。但只有当你点击按钮时,变量才会被激活updated@ArunPJohny正确的。。否则不会触发摘要。Dang,如果它真的太昂贵,那么也许我应该通过非角度js文件处理我的变量,并用jQuery显示它……如果您可以控制谁在更新值。。。。然后您可以考虑一个自定义jQuery事件,然后您可以使用directiveNow,我已经有了jQuery的工作方式。该值只是附加到一个范围。你是说我可以使用angular指令来监视这个范围的内容,并在这个附加值被更改时进行更新(jquery empty+append)?@pyramidface请看-这不会触发任何不必要的摘要周期
var updateDigest = function(){
    var appElement = document.querySelector('[ng-app=my-app]');
    var appScope = angular.element(appElement).scope();
    var controllerScope = appScope.$$childHead;
    controllerScope.$digest();
};

var counter = 0;
setInterval(function () {
    counter++;
    updateDigest();
}, 500);