Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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
铬+;原始Html(直接来自C#字符串)和#x2B;角度=>;尝试使用路由时出现的问题 头孢夏普:1.25.0(基于铬25.0.1364.152) 角度:1.3.0-beta16 UIRouter:0.2.10_Html_Angularjs_Routes_Location_Chromium - Fatal编程技术网

铬+;原始Html(直接来自C#字符串)和#x2B;角度=>;尝试使用路由时出现的问题 头孢夏普:1.25.0(基于铬25.0.1364.152) 角度:1.3.0-beta16 UIRouter:0.2.10

铬+;原始Html(直接来自C#字符串)和#x2B;角度=>;尝试使用路由时出现的问题 头孢夏普:1.25.0(基于铬25.0.1364.152) 角度:1.3.0-beta16 UIRouter:0.2.10,html,angularjs,routes,location,chromium,Html,Angularjs,Routes,Location,Chromium,我正在开发一个独立的C#应用程序,它使用CefSharp Chromium+Angular+UIRouter作为GUI所依赖的堆栈 我尝试让上面的堆栈加载此处提供的示例代码,结果非常成功: 为了使GUI的HTML+Javascript库更加优雅,请在应用程序的.Net可执行文件中的单个资源文件中进行组合 然后,该资源在应用程序初始化期间以编程方式传递到Chromium控件(通过.LoadHtml)以直接加载到浏览器中,也就是说,HTML不是从硬盘驱动器或远程HTTP服务器上的单独.HTML文

我正在开发一个独立的C#应用程序,它使用CefSharp Chromium+Angular+UIRouter作为GUI所依赖的堆栈

我尝试让上面的堆栈加载此处提供的示例代码,结果非常成功:

  • 为了使GUI的HTML+Javascript库更加优雅,请在应用程序的.Net可执行文件中的单个资源文件中进行组合

  • 然后,该资源在应用程序初始化期间以编程方式传递到Chromium控件(通过.LoadHtml)以直接加载到浏览器中,也就是说,HTML不是从硬盘驱动器或远程HTTP服务器上的单独.HTML文件加载的。如果HTML是从后来的(“标准”)场所加载的,那么一切都会完美地工作

我注意到,如上所述,当以字符串形式直接加载HTML时,生成的静态网页(aka window.location)的url设置为“about:blank”。angular似乎对这样的url有些恼火,尤其是在使用路由时:

  • 首先,调用:

    history.pushState(null, "", url);
    
    里面

    self.url = function(url, replace) { ... }
    
    抛出异常

    Error: SecurityError: DOM Exception 18
    Error: An attempt was made to break through the security policy of the user agent.
        at Browser.self.url (about:blank:8004:21)
        at about:blank:10049:24
        at Scope.$eval (about:blank:11472:28)
        at Scope.$digest (about:blank:11381:31)
        at Scope.$apply (about:blank:11493:24)
        at about:blank:6818:15
        at Object.invoke (about:blank:7814:19)
        at doBootstrap (about:blank:6817:16)
        at bootstrap (about:blank:6827:14)
        at angularInit (about:blank:6796:7)
    
    传递给.pushState的url为:

    about:blank#/home
    
    这似乎是将“about:blank”与默认状态“/home”连接在一起的结果

  • 第二,即使上述问题得到解决,内部似乎也存在一个重大问题:

    $rootScope.$watch(function $locationWatch() { ... })
    
    这将导致以下错误:

    Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
    
    原因是当“window.location”设置为“about:blank”时

    $browser.url()
    
    总是回来

    about:blank
    

    返回

    about:blank#/home
    
    导致$watch不停地开火

当angular以本文描述的方式处理直接加载到浏览器中的网页时,是否有适当的方法来处理这个缺点

如果没有解决这个问题的方法,那么我恐怕不得不求助于直接从硬盘中的文件加载HTML,这除了速度较慢(无法将字符串缓存到内存以供后续使用)之外,还明显偏离了开发独立exe的目标(


提前感谢,如果这个问题已经在其他地方得到解决,我深表歉意。

大多数浏览器不允许在文件系统上使用AJAX。但是Chromium可以调整以实现这一点:

browser = new ChromiumWebBrowser(path);
browser.BrowserSettings = new BrowserSettings();
browser.BrowserSettings.FileAccessFromFileUrlsAllowed = true;

默认情况下,Firefox允许在从加载的html文件中加载外部文件”file:///...“。但Chrome没有。在CefSharp(Chrome)中,您可以通过以下方式执行此操作:

    // Allow angular routing and load external files
    BrowserSettings setting = new BrowserSettings();
    setting.FileAccessFromFileUrls = CefState.Enabled;
    browser.BrowserSettings = setting;
    this.Controls.Add(browser);
    // Allow angular routing and load external files
    BrowserSettings setting = new BrowserSettings();
    setting.FileAccessFromFileUrls = CefState.Enabled;
    browser.BrowserSettings = setting;
    this.Controls.Add(browser);