2013-01-12 34 views
10

tôi có một textbox html với sự kiện onkeypress để gửi thông báo như bên dướiphím Enter cho phép sử dụng loại trực tiếp và chức năng javascript

<input type="text" data-bind="attr:{id: 'txtDim' + $data.userID, onkeypress: $root.sendMsg('#txtDim' + $data.userID, $data)}" /> 

Tôi đã viết hàm javascript để gửi tin nhắn trong khi preesing nhập nút như dưới đây:

self.sendMsg = function (id, data) { 
    $(id).keydown(function (e) { 
     if (e.which == 13) { 
      //method called to send message 
      //self.SendDIM(data); 
     } 
    }); 
}; 

Trong trường hợp của tôi, tôi phải nhấn nút enter 2 lần để gửi tin nhắn. 1: tự động bấm phím gọi.sendMsg 2: tự bấm phím gọi .endDIM

Nhưng tôi chỉ cần gửi tin nhắn trên một lần bấm phím. Nó có thể được thực hiện trong javascript đơn giản. Nhưng tôi cần dữ liệu viewmodel, vì vậy áp dụng trong dữ liệu-ràng buộc. Vì vậy, không làm việc tốt.

Trả lời

5

Tôi đã thêm như dưới đây vào hộp văn bản

<input type="text" data-bind="attr:{id: 'txtGoalsheetNote' + $data.userID}, event:{keypress: $root.SendMsg}" /> 

Và trong javascript tôi đã thêm phương thức sau bằng cách giữ sự kiện làm thông số

self.SendMsg= function (data, event) { 
    try { 
     if (event.which == 13) { 
      //call method here 
      return false; 
     } 
     return true; 
    } 
    catch (e) 
{ } 
} 

Sau đó, công việc của nó.

+0

Điều đó liên kết trực tiếp với bạn VM với giao diện người dùng của bạn, nó thường được coi là một mẫu chống. –

17

Lý do bạn cần nhấn enter hai lần là phương thức sendMsg của bạn chỉ gắn trình xử lý vào sự kiện keydown. Trình xử lý này sau đó được gọi trên nút bấm thứ hai.

Một cách tiếp cận tốt hơn sẽ được để viết một handler tùy chỉnh ràng buộc gắn các event handler và vượt qua mô hình xem qua:

ko.bindingHandlers.returnAction = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) { 

    var value = ko.utils.unwrapObservable(valueAccessor()); 

    $(element).keydown(function(e) { 
     if (e.which === 13) { 
     value(viewModel); 
     } 
    }); 
    } 
}; 

Bạn có thể thấy một sự kiện bấm phím running example here

+2

cảm ơn câu trả lời của bạn. nó cũng làm việc .. – akeeseth

+0

@akeeseth bạn được chào đón. Đừng quên đánh dấu một trong những câu trả lời này là câu trả lời được chấp nhận –

+0

Cảm ơn. Chính xác những gì tôi đang tìm kiếm. Tôi đã phải nhấn enter hai lần cho đến khi tôi nhận thấy valueUpdate: 'afterkeyup' trong jsFidde. – Aaron

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