2015-03-25 26 views
12

Tôi nhận được lỗi trên khi cố gắng sử dụng html5Mode với ui-router. Bất cứ ai có thể chỉ cho tôi những gì tôi đang làm sai?LoạiError: Không thể đọc thuộc tính 'replace' của undefined

TypeError: Cannot read property 'replace' of undefined 
    at bd (angular.js:10555) 
    at Object.<anonymous> (angular.js:11403) 
    at l.$get.l.$digest (angular.js:14222) 
    at l.$get.l.$apply (angular.js:14493) 
    at angular.js:1449 
    at Object.e [as invoke] (angular.js:4182) 
    at d (angular.js:1447) 
    at sc (angular.js:1467) 
    at Jd (angular.js:1361) 
    at HTMLDocument.<anonymous> (angular.js:26086) 

Đó phân khúc trong angular.js là:

10554 function trimEmptyHash(url) { 
10555 return url.replace(/(#.+)|#$/, '$1'); 
10556 } 

Các tập tin định tuyến:

(function(){ 

    'use strict'; 

    angular 
     .module('app') 
     .config(routes); 

     routes.$inject = ['$stateProvider', '$locationProvider']; 

     function routes($stateProvider, $locationProvider) { 

      // Configure app states 
      $stateProvider 

       .state('app', { 
        abstract: true, 
        templateUrl: 'modules/app/app.html',     
        controller: 'AppController' 
       }) 

       .state('app.home', { 
        url: '/', 
        templateUrl: 'modules/home/index.html' 
       }); 

      $locationProvider.html5Mode(true); 
     } 
})(); 

tôi đã thiết lập các địa chỉ cơ sở trong html:

<base href="/app/" /> 
+0

http://stackoverflow.com/questions/28859276/locationprovider-html5modetrue-issues và http://stackoverflow.com/questions/21863670/case-insensitivity-with-angularjs-ui-router –

+0

Các giải pháp đó không dường như hoạt động. Tuy nhiên, tất cả các URL của tôi đều thấp hơn, vì vậy tôi không chắc rằng URL đó có thể áp dụng được. – babbaggeii

+1

Vì vậy, 'url' là không xác định.Nhìn xuống dấu vết ngăn xếp và xem ai đang gọi 'trimEmptyHash'. Tìm mã có nghĩa vụ đặt mã và xem lý do mã không xác định. –

Trả lời

0

của bạn trạng thái 'ứng dụng' không có khóa url xác định d.

-5

bạn phải gỡ bỏ này từ tập tin html

<base href="/app/" /> 

và điều này từ app.js đang

$locationProvider.html5Mode(true); 
+4

Vâng, điều đó có ích, nhưng không phải nếu bạn muốn khách hàng của mình bị ấn tượng bởi URL đẹp của bạn. – trysis

+2

Brilliant! Tôi sẽ xóa html5Mode khi tôi đang cố gắng sử dụng nó! Bạn thậm chí đã đọc câu hỏi chưa? – Silveraven

11

Tôi chạy vào cùng một vấn đề, và trong trường hợp của tôi không xác định "url" tranh luận được chuyển đến trimEmptyHash() cuối cùng xuất phát từ thực tế là $$ absUrl propery trên $ location không được khởi tạo. Đào sâu hơn, có vẻ như $$ absUrl thường được khởi tạo trong phương thức $$ compose(), thường được gọi từ $$ parse() thường được gọi là phương thức $$ parseLinkUrl(). Dưới đây là $$ parseLinkUrl() (nhìn 1.4.1 góc):

this.$$parseLinkUrl = function(url, relHref) { 
    if (relHref && relHref[0] === '#') { 
    // special case for links to hash fragments: 
    // keep the old url and only replace the hash fragment 
    this.hash(relHref.slice(1)); 
    return true; 
    } 
    var appUrl, prevAppUrl; 
    var rewrittenUrl; 

    if ((appUrl = beginsWith(appBase, url)) !== undefined) { 
    prevAppUrl = appUrl; 
    if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) { 
     rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); 
    } else { 
     rewrittenUrl = appBase + prevAppUrl; 
    } 
    } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) { 
    rewrittenUrl = appBaseNoFile + appUrl; 
    } else if (appBaseNoFile == url + '/') { 
    rewrittenUrl = appBaseNoFile; 
    } 
    if (rewrittenUrl) { 
    this.$$parse(rewrittenUrl); 
    } 
    return !!rewrittenUrl; 
}; 

Trong trường hợp của tôi, trận chung kết "nếu" điều khoản được không kích hoạt cuộc gọi đến $$ phân tích cú pháp, bởi vì "rewrittenUrl" không bao giờ có một giá trị, bởi vì không có mệnh đề if/else nếu ở giữa được giải quyết thành true. Trong trường hợp của tôi, đó là vì url tôi đang sử dụng để phục vụ ứng dụng (CompanyName/admin.html) thực sự nằm trên cơ sở Href mà tôi đã đặt cho ứng dụng (CompanyName/admin /), vì vậy không có điều kiện nào được giải quyết thành sự thật . Ngay sau khi tôi thay đổi Href cơ sở của mình thành chỉ CompanyName /, tôi không còn gặp vấn đề này nữa.

Hoặc, bạn có thể khởi chạy $$ absUrl trên mẫu thử nghiệm vị trí hoặc chờ một số loại sửa lỗi từ Angular - xem this issue và xem giải pháp được đề xuất bởi joelmdev vào ngày 30 tháng 3.

+2

Tôi không thể tin rằng nhóm Angular đã làm điều đó. Điều này tất cả nhưng không cho phép chế độ HTML5 trên các trang web với bất cứ điều gì nhiều hơn định tuyến đơn giản, ví dụ Rails hoặc ASP.NET các trang web mà thư mục công cộng thậm chí không ở cùng một vị trí như các tập tin định tuyến. – trysis

+0

Xin lỗi, tôi không chính xác về nhận xét cuối cùng của tôi. Có thể sử dụng Rails, vv với chế độ HTML5 của Angular, nhưng nó làm cho việc bắt đầu các nhóm và thử nghiệm trở nên khó khăn hơn, vì họ sẽ không có lộ trình của họ được thiết lập và phải sử dụng API cũ. Sau đó, một lần nữa, khách hàng có thể sẽ không nhìn thấy những điều này, và hy vọng các đội sẽ có lộ trình của họ được thiết lập vào thời điểm họ làm. – trysis

0

Những gì bạn cần làm là mô tả ở đây: ui-router on GitHub Khi bạn cấu hình phía máy chủ định tuyến, tất cả mọi thứ nên làm việc tốt miễn là bạn tránh mở trang web bạn với url như thế này: http://localhost/app-base#/

6

Tôi đã nhìn thấy cùng này chính xác TypeError: Cannot read property 'replace' of undefined lỗi khi sử dụng html5mode quá, cho đến khi tôi đã thay đổi:

<base href="app/" /> 

để

<base href="/app/" /> 

Lưu ý, dấu gạch chéo bị bỏ sót trước đó. Hy vọng điều này có thể giúp ai đó.

+4

Tôi đã kiểm tra kỹ điều này và tôi đã có/trước là/sau, nhưng điều gì gây ra vấn đề của tôi, đó là trường hợp nhạy cảm! Đảm bảo tất cả chữ thường của nó đã khắc phục được sự cố của tôi – Gillardo

Các vấn đề liên quan