2013-08-31 35 views
7

Gần đây tôi đã bắt đầu sử dụng knockout.js và sammy.js để hiện đại hóa ứng dụng của mình. Tuy nhiên tôi đã bị mắc kẹt với một số vấn đề.chặn sammy.js khỏi ăn cắp 'liên kết thực'

Tôi có một số liên kết hợp lệ trên trang - người dùng thực sự nên điều hướng đến vị trí đó, thay vì bắt chước các hành vi điều hướng bằng cách sử dụng sammy.js. Tôi chỉ muốn các liên kết dựa trên băm được định tuyến bởi sammy.js, nhưng nó cũng chặn các liên kết không chứa bất kỳ băm nào. Ví dụ:

chẳng hạn, nó chặn <a href="/logout">logout</a>.

phần js mà không định tuyến là:

Sammy(function() { 
    this.get('#/', function() { 
     ... 
    }); 

    this.get('#:id', function() { 
     ... 
    }); 

    this.get('', function() { this.app.runRoute('get', '#/') }); 
}).run(); 

Tôi nghĩ this.get('' ..) phần là thủ phạm mà gọi hành vi này - tôi đã nhận nó từ knockout.js hướng dẫn, trong đó nói rằng dòng là cần thiết để cho phép người dùng từ các nguồn gốc khác để duyệt đúng trang web của tôi. trang được chạy bởi mã knockout.js là /w/. Tôi muốn sammy.js chỉ hoạt động trong /w/ hoặc ít nhất cho phép người dùng điều hướng đến /logout. Làm thế nào tôi có thể thực hiện điều này?

+0

Bạn đã bao giờ giải quyết vấn đề này chưa? Nếu không, tôi chắc chắn sẽ khuyên bạn nên sao chép này trên [jsfiddle] (http://jsfiddle.net/). – edhedges

+0

@edhedges Tôi nghĩ đây là về việc xác định các điểm vào của ứng dụng web của bạn. ứng dụng của tôi là ứng dụng nhiều trang truyền thống có HTML được tạo từ máy chủ web python (và tận dụng sammy.js và hash + ajax ở một mức độ nào đó). Vì vậy, giải pháp của tôi cho điều này đã được loại bỏ 'this.get ('', ...)' và đặt 'location.href = '. các url không băm không bị chặn. – thkang

+0

Bạn nên tự mình trả lời câu hỏi cho người khác nếu bạn đã giải quyết nó. – edhedges

Trả lời

1

Bạn có thể sử dụng chức năng "xung quanh". Có rất nhiều lựa chọn. Tôi đề nghị làm như sau,

Giả sử có một số url. Khi nhấn url đó, bạn muốn kết nối máy chủ với trang. Ví dụ: url đăng xuất như "/ đăng xuất".

Bây giờ làm url như sau

"/logout?reload=true" 

Do đó, bạn có thể kiểm soát bằng cách làm theo đang Sammy của

Sammy(function(){ 

    this.around(function(callback) { 
     if(this.params.reload === 'true')  
      location.replace(this.path); 
     else 
      callback(); 
    }); 
    // Your routers are going to be here 

}).run() 
+0

Bạn quên gọi lại cuộc gọi lại, vì vậy sẽ không có gì xảy ra nếu không có tải lại. Tôi rất tự do để chỉnh sửa câu trả lời của bạn. Bây giờ nó hoạt động như quảng cáo! Cảm ơn! – user562529

10

Được một lúc kể từ khi tôi sử dụng Sammy, nhưng tôi nghĩ bạn có thể tắt này hành vi với cài đặt disable_push_state:

Sammy(function() { 
    this.disable_push_state = true; 
    ... 
}); 
0

Tôi thấy rằng nếu tôi so sánh window.loc ation đến một bản sao của vị trí cửa sổ được lưu trữ khi khởi động, tôi có thể thoát khỏi bẫy Sammy một cách an toàn. Nếu các url cơ sở khớp nhau, tôi chạy tuyến đường cơ sở. Nếu chúng không khớp, tôi tải lại window.location và bỏ Sammy.js.

function myUrl() { 
    var url= window.location.href; 
    if (window.location.hash) { 
     url= url.replace(window.location.hash, ""); 
    } 
    if (window.location.search) { 
     url= url.replace(window.location.search, ""); 
    } 
    return url; 
} 

... 

Sammy(function() { 

    var myLocation = myUrl(); 

    ... 

    this.get('', function() { 
     if (myLocation === myUrl()) { 
      this.app.runRoute('get', '#/'); 
     } else { 
      window.location.reload(true); 
      this.unload(); 
     } 
    }); 
}).run();