【问题标题】:Cross Document/Window AngularJS App跨文档/窗口 AngularJS 应用程序
【发布时间】:2014-05-27 14:38:27
【问题描述】:

我正在构建一个打包的 chrome 应用程序并且想要使用 Angular。作为具有类似于本机应用程序的 ui 行为的本地应用程序,我想利用多个窗口来显示弹出窗口和不同的工作流程。与对话框或模式相比,这对用户来说更直观。

在这些窗口之间共享服务实例是否有很好的角度方式?有没有我没有看到的其他解决方案?

更新

更清楚一点,我想在 javascript 窗口之间共享数据。有基本的window.postMessage,但我希望能够在这两个单独的窗口之间共享服务实例。

可能的解决方案

我发现了一个分享服务的技巧,并在下面发布了一个答案。我很想对它有想法。如果我可以共享$injector 服务本身,可能更理想。这可能会处理所有可能的选项,并使其就像在同一个应用程序中一样。我相信$injector 引用了 DOM 中的 rootElement,这在新窗口中当然会有所不同,因此解决方案可能不起作用。想法?

【问题讨论】:

    标签: javascript angularjs google-chrome-app


    【解决方案1】:

    Angular不提供任何跨窗口支持或任何对设计本地应用程序特别有用的东西。事实上,它并不需要,尤其是对于 Chrome 应用。

    查看 Google 为 Chrome 应用程序提供的 localStorage 包装器,它提供了一些额外的便利(例如在线同步):chrome.storage。您不能像在“普通”网络应用程序中那样使用 window.localStorage,因此即使您只需要 localStorage 的基础知识,也需要使用它。

    文档有点稀疏,但您可以在此处找到其使用教程,包括 Angular 示例代码:Save and Fetch Data

    最后,明智的做法是通过一个或多个服务来管理此存储,就像您倾向于处理 AJAX 调用/外部数据资源一样,以便跨控制器封装和重用。

    更新:

    根据下面@Xan 的评论,您还可以考虑使用 FileSystem API,它可以为您的应用提供

    创建、读取、导航和写入用户的沙盒部分 本地文件系统

    根据您应用的需求,这在处理较大的数据块时可能非常有用,尤其是在与对象存储和$watchers 和/或$interval 轮询结合使用以检测应用实例之间的更改时。

    更多来自Exploring the FileSystem APIs

    【讨论】:

    • 另一个值得一提的存储选项是FileSystem API。虽然没有其他浏览器会实现它,但 Chrome 将其宣传为应用程序的 API。
    • 这是一个很好的答案,但不符合我的要求。我正在寻找在单独的 javascript 窗口对象之间共享角度服务。使用 chrome 应用程序 api,chrome.app.window.create,我可以创建一个新的弹出窗口,但我想在这两个窗口之间进行角度通信。当然有window.postMessage,但不适用于我想要的沟通水平。
    【解决方案2】:

    我已经能够想出一种跨多个窗口共享服务的方法,但它仍然有点笨拙,如果可用,我希望有更好的解决方案。

    在您作为 chrome 应用程序的父窗口中,您将使用以下代码启动一个新窗口。

      chrome.app.window.create("view2.html", options, function(window){
    
        //This function is a callback that is called when the child 
        //window has been created and launched.
        //I believe it has first access to the window object before any child code
        //Note that the parameter is not the true javascript window but only 
        //a chrome wrapper object. The window is window.contentWindow
    
        //We are going to place an object on the window that the child code will look for
        window.contentWindow.sharedDependencies = {
           shared_dependency: dependency,
           other_shared_dep: dependency2
        }
      });   
    

    然后当您的第二个页面加载时,它可以检查窗口上的属性sharedDependencies 并适当地加载它们。

    //The main module must have the dependency module
    angular.module("main_app", ["dependancyModule"]);
    
    var deps = angular.module("dependancyModule", []);
    
    if(typeof window.sharedDependencies === "object")
    {
       for(var name in sharedDependencies)
          //Register each dependency as a value because we are receiving 
          //it as a value- not as a factory method or a service method. 
          deps.value(name, sharedDependencies[name]);
    }
    

    我在一个打包的应用程序中尝试了这个,它工作了,但是你必须手动调用 $apply(),因为在一个上下文中更改某些内容不会提醒另一个上下文。我还没有想到一个优雅的解决方案。

    我也是 Angular 的初学者,所以这可能不支持 Angular 的其他方面。除了与共享对象的简单绑定之外,我还没有对其进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多