gpt4 book ai didi

javascript - 从第三方初始化触发 Angular

转载 作者:行者123 更新时间:2023-12-02 17:45:26 25 4
gpt4 key购买 nike

我是 Angular 新手,使用简单的 Angular 应用程序没有问题,但现在我想与第三方组件集成。我可以想到一些小窍门来实现我想要做的事情,但我更喜欢使用一个干净的解决方案来满足一般要求:如何从“外部” Angular 调用 Angular 代码?

我希望我的 Angular 应用程序初始化启动 View ,然后等待第三方软件初始化,然后让 Angular 显示主视图。第三方软件通过各种异步调用进行初始化,可能需要一两秒,或者在极端情况下更长。它提供了一个回调函数,当它准备好时将被调用。

现在来模拟我得到的效果:

.controller('MySplash', ['$scope', '$location', '$q', 
function($scope, $location, $q) {

$scope.waitForInit = $q.defer();

$scope.waitForInit.promise.then(function() {
$location.path('/tab/MyMainView');
});

$scope.waitForInit.resolve(); // fake the post-init triggering
}])

所以这显示了启动屏幕,当满足延迟时显示主屏幕,在这种情况下当然会立即发生。

我还有第三方软件提供的功能

 CalledWhenThirdPartyReady() {
// put some code here
}

从概念上讲,我想做的就是将解析调用移至此回调中

 CalledWhenThirdPartyReady() {
$scope.waitForInit.resolve();
}

从根本上来说,我的难题是如何获得一些有效地独立访问 DI 的代码。从概念上讲,我想做的就是调用 Angular 服务,或访问 Angular 变量。我尝试过这种事情

 CalledWhenThirdPartyReady() {

angular.module('myApp')

.run(["$rootScope", "$location",
function ($rootScope, $location) {
// just to show access to DI-ed variables
console.log("Run in module", $rootScope, ",", $location);

}] );
}

认为 run 方法将被调用并且我可以访问注入(inject)的变量,但 run 永远不会被触发,我猜是因为我注册 run() 太晚了。

最佳答案

尝试使用$apply :

$apply() is used to execute an expression in angular from outside of the angular framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). Because we are calling into the angular framework we need to perform proper scope life cycle of exception handling, executing watches.

例如:

CalledWhenThirdPartyReady() {
$scope.$apply($scope.waitForInit.resolve());
}

这需要 CalledWhenThirdPartyReady可以访问 $scope ,例如,如果它是在您的 controller 中定义的。如果您需要CalledWhenThirdPartyReady要在 Angular 应用程序外部定义,您需要以其他方式处理它。

调用 controller 中的函数的示例从外部看:

JS:

var app = angular.module('myApp', []);

app.controller('MySplash', ['$scope', '$location', '$q',
function($scope, $location, $q) {

$scope.waitForInit = $q.defer();

$scope.waitForInit.promise.then(function() {
console.log('Resolved.');
});

$scope.resolve = function () {
$scope.waitForInit.resolve();
}
}
]);

HTML:

<body ng-controller="MySplash">
</body>

<script type="text/javascript">
window.onload = function() {

console.log('Loading.');
window.setTimeout(function () {
var controllerScope = angular.element(document.querySelector('body')).scope();
controllerScope.resolve();
}, 1000);
}
</script>

关于javascript - 从第三方初始化触发 Angular ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21809054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com