2014-12-02 16 views
7

Tôi muốn biết cách lấy giá trị TEXT được chọn từ trình đơn thả xuống, chỉ cần nhớ rằng trình đơn thả xuống của tôi có dữ liệu cố định và không được điền bởi "ko.observableArray()". Bất kỳ ý tưởng?Knockout.js - Nhận giá trị văn bản đã chọn trong trình đơn thả xuống

Khi tôi chọn một tùy chọn muốn có: Lựa chọn giá trị và văn bản.

<p> 
    Select a car: 
    <select data-bind="value: selectedValue, optionsText:???"> 
     <option value="volvo">Volvo</option> 
     <option value="saab">Saab</option> 
     <option value="mercedes">Mercedes</option> 
     <option value="audi">Audi</option> 
    </select> 
</p> 

<span data-bind="text: selectedValue"></span> 
<br/> 
<span data-bind="text: selectedText"></span> 

tôi ko ViewModel:

var viewModel = { 
     selectedValue : ko.observable(), 
     selectedText : ko.observable() 
}; 

ko.applyBindings(viewModel); 

Xem Fiddle này: JSFiddle

+1

Tạo một mảng của văn bản/giá trị và ràng buộc đó. Sử dụng loại trực tiếp như dự định, đừng cố gắng làm việc xung quanh việc lạm dụng. –

Trả lời

1

Bạn phải làm việc với các tùy chọn bắt buộc cho việc này. Và giống như Jeff nói, đừng lạm dụng.

var viewModel = { 
     selectedValue : ko.observable(), 
     selectedText : ko.observable(), 
    carOptions : ['Volvo','Saab', 'Mercedes', 'Audi'] 
}; 

ko.applyBindings(viewModel); 

Markup:

<p> 
    Selecte a car: 
    <select data-bind="value: selectedValue, options: carOptions"> 

    </select> 
</p> 

<span data-bind="text: selectedValue"></span> 
<br/> 
<span data-bind="text: selectedText"></span> 

Đây là cách đơn giản nhất để làm như vậy. Để biết các tình huống phức tạp hơn, hãy truy cập vào docs.

JsFiddle 1, JsFiddle 2

+0

Bây giờ tôi hiểu, không thể làm được điều này! Cảm ơn vi đa trả lơi. Nhưng vẫn không liệt kê hai giá trị ... làm sao chúng ta có thể làm được? – IgoR

+0

Đã cập nhật bài đăng, tuy nhiên bạn nên đọc tài liệu quá ... – deostroll

+0

Cảm ơn, tôi đã đọc và thậm chí có một câu đố làm điều này. Câu hỏi đó đã không được đăng để biết nếu bạn có một số cách khác để làm điều này. Vì vậy, nhiều như vậy mà tôi rời này rõ ràng về vấn đề :. "... Que nhớ trình đơn thả xuống của tôi có ngày cố định và không được điền bởi 'ko.observableArray()'" Cảm ơn lần nữa. – IgoR

11

Tôi không biết nếu có một giải pháp khả thi với Knockout.js. Tôi cho phép bạn hai giải pháp khả thi:

Giải pháp 1

Bạn có thể sử dụng một chút Javascript mẹ đẻ để đạt được mục tiêu của bạn:

viewModel.selectedValue = ko.observable(); 
viewModel.selectedText = ko.computed(function() { 
    var elem = document.querySelector("select option[value=" + viewModel.selectedValue() + "]"); 
    return elem && elem.innerHTML; 
}); 

Như bạn thấy, bạn có thể đi "giá trị" và sử dụng nó để trả về phần tử DOM đáp ứng các yêu cầu của bạn. Tất nhiên bạn có thể thay thế select bằng id, nếu bạn cần.

Kiểm tra this fiddle để xem nó hoạt động.

Giải pháp 2

Cách Knockout để làm điều này là có một mảng với tất cả các yếu tố trở nên thông dụng:

var cars = [{ id: 'volvo', name: 'Volvo' }, { id: 'saab', name: 'Saab' }, { id: 'mercedes', name: 'Mercedes' }, { id: 'audi', name: 'Audi' }]; 

Sau đó, nó phụ thuộc vào những gì bạn cần khi bạn nói "value ", hãy nhớ rằng bạn đang ràng buộc đối tượng, không phải danh sách khóa/giá trị:

HTML:

<select data-bind="options: cars, value: selectedCar, optionsText: 'name'"></select> 

Và JS của bạn:

selectedCar = ko.observable(); 
selectedValue = ko.computed(function() { 
    return selectedCar() && selectedCar().id; 
}); 
selectedText = ko.computed(function() { 
    return selectedCar() && selectedCar().name; 
}); 

Bằng cách này bạn sẽ có một cách riêng biệt "giá trị" của bạn và "văn bản" của mình (gọi là tốt hơn idname tài sản) thành hai quan sát tính toán.

Xem the fiddle working.

+0

Cảm ơn, tôi đã đọc và thậm chí có một fiddle mà làm điều này. Câu hỏi đó đã không được đăng để biết nếu bạn có một số cách khác để làm điều này. Vì vậy, nhiều như vậy mà tôi rời này rõ ràng về vấn đề :. "... Que nhớ trình đơn thả xuống của tôi có ngày cố định và không được điền bởi 'ko.observableArray()'" Cảm ơn lần nữa. – IgoR

+0

Ok, tôi đã cập nhật câu trả lời của mình. – lante

+0

Vâng, tốt! Tôi đã nhìn thấy một cái gì đó như thế này trong tìm kiếm của tôi: http://stackoverflow.com/a/11170582/2145555, nhưng sử dụng jQuery selector. Cảm ơn thời gian và phản hồi. – IgoR

2

Tôi vừa phải đạt được điều này và tôi đã thêm một chức năng ko.computed để lấy văn bản đã chọn từ các tùy chọn như sau:

// assume that options has been populated with Key/Value pairs 
self.options = ko.observableArray([]); 

self.selectedType = ko.observable(null); 
self.selectedTypeText = ko.observable(null); 
self.selectedType.subscribe(function (newValue) { 
    if (newValue) { 
     self.checkAccess(newValue); 

     $.each(self.options(), function (i, item) { 
      if (item.Key === newValue) { 
       self.selectedTypeText(item.Value); 
      } 
     }); 
    } 
}); 
Các vấn đề liên quan