2015-05-19 18 views
9

Tôi đang phát triển một ứng dụng web angularJS nơi tôi cần quét gói từ thiết bị di động và tôi đang sử dụng bridgeit cho điều đó.Tích hợp AngularJS và Bridgeit.js (ứng dụng web di động)

Trong góc cạnh, tôi đã viết mã sau để thực thi chức năng nhưng có vẻ như nó không hoạt động.

HTML Mã sản phẩm:

<input id="inp" /> 
<button id="scan" ng-click="scan()"> Scan </button> 

JS Mã sản phẩm:

// inside angular controller 
$scope.scan = funcction() { 
    bridgeit.scan('scan', 'window.scan'); 
} 

// in global scope 
window.scan = function(event) { 
    alert(event.data); 
} 

quả: ý chí bridgeit thể quét qr/mã vạch nhưng nó không trả lại giá trị .

+0

Tôi đang thực sự xem xét cách thực hiện việc này cho dự án của riêng mình. Tôi sẽ cố gắng chia sẻ kết quả của mình. – OrangeKing89

Trả lời

2

Sau một vài lần thử, tôi thấy rằng vấn đề là với hashtags trong URL.

Hãy lấy một ví dụ sử dụng cùng một mã,

// inside angular controller 
$scope.scan = funcction() { 
    bridgeit.scan('scan', 'bridgeitCallback'); 
} 

// in global scope 
window.bridgeitCallback = function(event) { 
    alert(event.data); 
} 

Tôi có một url, như, http://stackoverflow.com/#question và tôi có một lĩnh vực quét bên trong trang đó.Vì vậy, khi tôi quét mã vạch, nó thay đổi URL để, một cái gì đó như thế nào,

http://stackoverflow.com/#c=scan%3Fid%3Dscan%26&r=http%3A//stackoverflow.com%23icemobilesx&o=enc%3Dbase64&h=%26h%3D%2523/question%26c%3DbridgeitCallback%26seq%3D1432552876578

rõ ràng hơn,

http://stackoverflow.com/#c=scan{{some_uri_encode_characters}}/{{your_route,mine_is question}}/{{bridgeit_callback_method}} 

Vì vậy, nó không bao giờ có thể có một thành công POST gọi lại.

Tôi chỉ kích hoạt html5Mode trong góc, với,

$locationProvider.html5Mode(true); 

và mọi thứ hoạt động như một nét duyên dáng.

Hy vọng nó sẽ giúp người dùng trong tương lai.

+0

Vui vì bạn đã giải quyết nó. Mã vạch của tôi không lưu trữ bất kỳ loại URL nào nên tôi không gặp vấn đề này. – OrangeKing89

+0

Chúng tôi có thể ngăn không cho bridgeit lưu trữ URL. Nếu có, hãy cập nhật câu trả lời của bạn. Tôi sẽ chấp nhận nó. –

3

Thử cung cấp chức năng trên phạm vi toàn cầu và đặt tên cho cầu nối.

Ngay bây giờ bạn chỉ gán nó vào một tài sản trên cửa sổ gọi là quét

Ngoài ra hãy chắc chắn rằng bạn không có chức năng bên trong của bất kỳ chức năng khác hoặc ẩn từ phạm vi toàn cầu một cách nào đó.

Brigeit đánh giá chuỗi trên trang web để gọi hàm của bạn.

// inside angular controller 
$scope.scan = funcction() { 
    bridgeit.scan('scan', 'globalScan'); 
} 

// in global scope 
window.scan = function globalScan(event) { 
    alert(event.data); 
} 

Cập nhật:

Một điều khác mà có thể giúp là cố gắng tạo ra chức năng toàn cầu của bạn trước khi bạn thêm đoạn mã bridgeit.

Điểm mấu chốt là bridgeit xử lý các chuỗi bạn đưa nó vào hàm eval và tìm nó trên phạm vi toàn cục.

+0

Chỉ định hàm/phương thức cho bất kỳ thuộc tính đối tượng nào có nghĩa là bây giờ nó có thể được truy cập như một hàm/phương thức. Tôi nghĩ, mã của bạn sẽ hoạt động giống như mã của tôi. Hơn nữa, bạn đã tạo thêm một hàm, tức là 'window.scan' được sử dụng ở đâu đó. –

+0

Tôi đã cố gắng thay đổi ít nhất có thể vì tôi không biết bạn có thể đang sử dụng tham chiếu window.scan nào khác. Có một sự khác biệt giữa việc gán một hàm cho một tên và đặt nó vào một biến. khi bạn chỉ gán nó cho một biến, nó vẫn là một hàm ẩn danh về mặt kỹ thuật, nó chỉ được lưu trữ trong một biến. – OrangeKing89

+0

Một điều khác có thể giúp bạn là thử tạo hàm toàn cục trước khi thêm tập lệnh bridgeit. Điểm mấu chốt mặc dù là bridgeit xử lý chuỗi bạn cung cấp cho nó một hàm eval và tìm nó trên phạm vi toàn cục. – OrangeKing89

2

Đây là mã tôi đang sử dụng trong chương trình của riêng tôi:

function bridgeitCallback(result) 
{ 
    alert("result is: " + JSON.stringify(result)); 
} 

$(document).ready(function readyDoc() 
{ 
    var scanButton = $('#scanButton'); 
    scanButton[0].addEventListener('click', function() { 
     bridgeit.scan('scan', 'bridgeitCallback'); 
    }); 
}); 

này đang làm việc cho tôi. Tôi vừa thêm nó vào cuối lớp điều khiển chính của tôi bên ngoài góc cạnh.

Bạn sẽ có thể lấy phần trong chức năng sẵn sàng và đặt nó ở bất kỳ đâu trên trang.

Cập nhật:

Do cách các trình duyệt web hiệu quả, trang web của bạn sẽ được làm mới khi bạn trở về từ cuộc gọi đến Bridgeit vì vậy bạn sẽ cần phải tìm ra một số cách để lưu trữ bất kỳ thông tin mà bạn cần phải giữ.

Bộ nhớ cục bộ có lẽ sẽ là lựa chọn tốt nhất. Thư viện AmplifyJS là một cách rất đơn giản để làm điều này.

+0

Bạn đã thử nó với url 'hashtags' chưa. Cho dù bridgeit làm việc với họ hay không ?? –

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