【问题标题】:AngularJS $routerProvider not working properly in node-webkitAngularJS $routerProvider 在 node-webkit 中无法正常工作
【发布时间】:2013-11-21 04:10:48
【问题描述】:

我正在使用 node-webkit 和 Angular 构建一个桌面应用程序。我一直在使用 Angular 的 1.0.7 版,但我需要更新以利用对框架的改进。不幸的是,新的ngRoute 模块似乎无法正常工作,而我之前的路由没有问题。

angular-seed 样板为例,当应用程序加载时,它会显示view1,但单击view1 和view2 的链接似乎没有任何效果。我已经验证它在浏览器中用作网页时可以正常工作,但在 node-webkit 环境中它会失败。

我确实发现,如果我注释掉$routeProviderotherwise 选项,地址栏会显示index.html#/C:/view1 而不是app/index.html#/view1,当然,view1 和 view2 都不会显示,然后单击 view1和 view2 链接仍然没有效果。似乎链接可能被错误地解释了?如果是这样,它们应该如何格式化?我玩了一堆组合都没有效果。

app.js

'use strict';


// Declare app level module which depends on filters, and services
angular.module('myApp', [
  'ngRoute',
  'myApp.filters',
  'myApp.services',
  'myApp.directives',
  'myApp.controllers'
]).
config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'});
  $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'});
  $routeProvider.otherwise({redirectTo: '/view1'});
}]);

index.html

<!doctype html>
<html lang="en" ng-app="myApp">
<head>
  <meta charset="utf-8">
  <title>My AngularJS App</title>
  <link rel="stylesheet" href="css/app.css"/>
</head>
<body>
  <ul class="menu">
    <li><a href="#/view1">view1</a></li>
    <li><a href="#/view2">view2</a></li>
  </ul>

  <div ng-view></div>

  <div>Angular seed app: v<span app-version></span></div>

  <!-- In production use:
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
  -->
  <script src="lib/angular/angular.js"></script>
  <script src="lib/angular/angular-route.js"></script>
  <script src="js/app.js"></script>
  <script src="js/services.js"></script>
  <script src="js/controllers.js"></script>
  <script src="js/filters.js"></script>
  <script src="js/directives.js"></script>
</body>
</html>

【问题讨论】:

    标签: angularjs node-webkit


    【解决方案1】:

    我让它工作了。我使用 Angular 文档中使用的相同策略来使 ngRoute 示例代码在 plunkr 中工作。我不能说我完全理解为什么使用 stock angular-seed 配置它不起作用。如果有人有见解,我想听听。

    修改后的index.htmlapp.js 文件应如下所示:

    app.js

    'use strict';
    
    
    // Declare app level module which depends on filters, and services
    angular.module('myApp', [
      'ngRoute',
      'myApp.filters',
      'myApp.services',
      'myApp.directives',
      'myApp.controllers'
    ]).
    config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
      $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'});
      $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'});
      $routeProvider.otherwise({redirectTo: '/view1'});
      // configure html5 to get links working on node-webkit
      $locationProvider.html5Mode(true);
    }]);
    

    index.html

    <!doctype html>
    <html lang="en" ng-app="myApp">
    <head>
      <meta charset="utf-8">
      <title>My AngularJS App</title>
      <link rel="stylesheet" href="css/app.css"/>
      <script src="lib/angular/angular.js"></script>
      <script src="lib/angular/angular-route.js"></script>  
      <script type="text/javascript">
      //this is here to make node-webkit work with AngularJS routing
      angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
      </script>
    </head>
    <body>
      <ul class="menu">
        <li><a href="view1">view1</a></li>
        <li><a href="view2">view2</a></li>
      </ul>
    
      <div ng-view></div>
    
      <div>Angular seed app: v<span app-version></span></div>
    
      <!-- In production use:
      <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
      -->
      <script src="js/app.js"></script>
      <script src="js/services.js"></script>
      <script src="js/controllers.js"></script>
      <script src="js/filters.js"></script>
      <script src="js/directives.js"></script>
    </body>
    </html>
    

    请注意,在此模式下,index.html 不再是 URL 的一部分,因此如果您重新加载,nw 会尝试重新加载一个不存在的文件(例如 /path/to/app/view1)。您需要手动将其更新为/path/to/app/index.html。如果您可以让 nw 在重新加载时返回主页,那就太好了,但到目前为止我还没有看到实现这一点的选项。

    最新消息:这是由于bug in Angular 1.2.0,该问题已得到解决。 angular-seed 还没有更新到最新版本。

    【讨论】:

    • 你介意分享你的 package json 文件吗?我按照你的设置,我收到这个错误 NSWorkspace failed to open URL unsafe:app://toubaradio/views/playlist/42991671
    • 所以$locationProvider.html5Mode(true); 和 AngularJS 版本升级修复了它。正确的。我在您的 index.html 中看不到任何差异。如果没有,我建议你删除它。有时我们很匆忙,需要快速阅读,所以任何无关的东西都会妨碍我们。
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2012-07-31
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多