2013-05-01 7 views
7

Có cách nào để cập nhật một giá trị quan sát được khi giá trị <input> bị thay đổi, nhưng theo chương trình, tức là bằng Javascript?Cập nhật giá trị quan sát được khi giá trị đầu vào được thay đổi bởi Javascript

Đây là một jsfiddle của trường hợp sử dụng này mà tôi không thể làm cho nó hoạt động: http://jsfiddle.net/qYXdJ/

Như bạn thấy khi "Cập nhật giá trị đầu vào bởi Javascript" liên kết được nhấp các quan sát được rõ ràng là không được cập nhật, vì nó không được phản ánh trong <span>

+1

Điều này có thể không giúp bạn, nhưng dưới mui xe, cập nhật được phát hiện bởi sự kiện 'thay đổi'. Thay đổi một cách có lập trình giá trị của một trường đầu vào dường như không kích hoạt sự kiện 'thay đổi': http://jsfiddle.net/qYXdJ/3/ – apsillers

+0

Tôi hơi bối rối, có lẽ do thiếu kiến ​​thức ko, nhưng khi Tôi nhấp vào "Cập nhật giá trị đầu vào bằng Javascript" sau khi nhập một số văn bản, văn bản xuất hiện bên cạnh "Giá trị đầu vào là::", do đó, được cập nhật. Tôi đang thiếu gì? –

+0

Bạn sẽ thấy "Giá trị đầu vào là: Giá trị mới" thay vì – tomor

Trả lời

9

Nếu bạn hoàn toàn có thể không thay đổi quan sát trực tiếp (đó là cách tốt nhất), bạn có thể kích hoạt các "onchange" sự kiện (mà Knockout sử dụng trong nội bộ). Với jQuery, đó là một vấn đề đơn giản:

$('#update').on('click', function() { 
    $('#input2').val('New Value').trigger('change'); 
}); 

Nếu bạn không muốn sử dụng jQuery vì lý do gì, có một cái nhìn tại this question.

+0

Cuối cùng tôi đã làm một cái gì đó như thế này. Về cơ bản, giá trị được đặt bằng Javascript và sau đó tôi kích hoạt sự kiện 'thay đổi' theo cách thủ công. Dường như làm việc tốt cho đến nay! Cảm ơn bạn! – tomor

+0

Tuyệt vời! Cảm ơn bạn đã gợi ý về cách sử dụng 'change()' :-) – Oliver

+0

Cảm ơn bạn. Điều này đã làm cho tôi. –

3

Bạn phải thay đổi thuộc tính viewModel 'name' thay vì giá trị trường đầu vào, vì nó có thể quan sát được và mọi thay đổi về thuộc tính sẽ được phản ánh cho tất cả các phần tử html được liên kết.

var viewModel = { 
     name: ko.observable() 
    }; 
    ko.applyBindings(viewModel); 

    document.getElementById('update').onclick = function(){ 
     viewModel.name('New Value'); 
     //document.getElementById('input2').value = 'New Value'; 
    } 
+0

Cảm ơn nhưng tôi cần thay đổi trường nhập một cách rõ ràng, thay vì viết trên quan sát được. – tomor

+0

Trường nhập của bạn không thể quan sát được. –

3

Vì cá cyanfish chỉ ra cách chính xác là cập nhật quan sát được.

Nếu vấn đề là mã của bạn không có quyền truy cập vào các quan sát được, ví dụ bạn đang viết một bookmarklet để tự động điền vào một mẫu đơn, sau đó bạn có thể truy cập vào các quan sát được như thế này:

function setValue(input, value) { 
    var bindingsString = input.getAttribute('data-bind'); 
    if (bindingsString) { 
    var bindings = ko.bindingProvider.instance.parseBindingsString(bindingsString, ko.contextFor(input), input); 
    if (bindings.value) { 
     bindings.value(value); 
    } else if (bindings.checked) { 
     bindings.checked(value); 
    } else { 
     input.value = value; 
    } 
    } else { 
    input.value = value; 
    } 
}