gpt4 book ai didi

javascript - 访问 AngularJS + Chrome Apps API 中的工厂属性

转载 作者:行者123 更新时间:2023-11-28 01:02:23 25 4
gpt4 key购买 nike

我正在尝试使用 AngularJS 构建 Chrome 应用程序,我需要的功能之一是通过 chrome.system.network.getNetworkInterfaces 监视可用的网络接口(interface)。目前,我正在尝试将此数据存储在工厂中并将其注入(inject) View Controller 中:

(尽可能精简)

工厂:

exampleApp.factory('exampleFactory', ['$http', function ($http) {
var service = {};
service.network_interfaces = 'Detecting network connections...';

chrome.system.network.getNetworkInterfaces(function(interfaces){
service.network_interfaces = interfaces;
})

// This outputs the expected array containing interface data
// in service.network_interfaces
console.log(service)

return service;
}]);

Controller :

exampleApp.controller('MainCtrl', ['$scope', '$http', 'exampleFactory', function($scope, $http, exampleFactory) {
// This outputs the expected array in network_interfaces, identical
// to the console output within the factory
console.log(exampleFactory)

// But then this outputs the initial 'Detecting network connections...'
// string set in the factory
console.log(exampleFactory.network_interfaces)

// And {{network_interfaces}} and {{factory_state}} in the view keep
// 'Detecting network connections...' as the value for network_interfaces
// permanently
$scope.factory_state = exampleFactory;
$scope.network_interfaces = exampleFactory.network_interfaces;
}]);

所以:

  1. 工厂似乎返回了一个很好的 service 对象,但我不确定为什么 exampleFactoryexampleFactory.network_interfaces 会有它们在 Controller 和工厂之间执行不同的状态,尤其是在 Controller 本身内(无论调用它们的顺序如何)。
  2. 我尝试了很多不同的解决方案,假设这是一个异步问题,但我认为 getNetworkInterfaces 方法不会有明显的延迟,而且如果有的话,一切都正常正确设置 Angular,以便在返回数据后更新 {{network_interfaces}}{{factory_state}} View 绑定(bind)。
  3. 我还尝试过使用 $rootScope.$apply 在工厂中封装各种函数,但结果与上面相同。

我进行了很多搜索,以发现我显然错过的概念,但我认为我忽略了一些基本的东西。如何将 getNetworkInterfaces() 数据以有用的状态输入到我的 Controller 中?

最佳答案

你在 #2 中的假设就是问题所在。在调用异步方法和调用其回调之间总是存在 JavaScript 事件循环的旋转。如果没有,调用该方法的客户端中的各种事情都会巧妙地中断。这意味着您在 Angular 开发中遇到了一个常见问题:您没有收到某些更改的通知,因为更改不是在 Angular 的摘要周期的上下文中发生的。

要解决此问题:尝试设置监视,然后在 getNetworkInterfaces() 回调中调用 $scope.apply() 。 apply() 保证在摘要周期之外发生,因此您不应该收到 apply-in-apply 错误。

或者,在回调完成后向自己发送一条消息。如果您是“如果您使用 apply() 则您的代码已损坏”思想流派的学生,那么这会更好。

最后,考虑在回调后调用的 Promise。这不太适合您设置代码的方式。

(另外,为什么要在工厂中调用异步方法?)

关于javascript - 访问 AngularJS + Chrome Apps API 中的工厂属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25468925/

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