2011-09-11 36 views
6

Tôi đã cố gắng sử dụng loại trực tiếp để thêm/xóa các tab jQueryUI nhưng không có bất kỳ may mắn nào. Mô hình chế độ xem của tôi là một mảng các đối tượng Hiệu ứng. Tôi muốn một tab được thêm/xóa khỏi điều khiển tab khi các đối tượng được thêm/xóa khỏi mô hình khung nhìn.Làm thế nào để thêm hoặc loại bỏ các tab jQueryUI bằng cách sử dụng loại bỏ JS?

Dưới đây là một JSFiddle ai đó bắt đầu và tôi cập nhật trong đó cho thấy những gì tôi đang tìm cách để làm JSFiddle example

Nó sẽ phá vỡ khi bạn cố gắng thêm một tab. Tôi nghĩ rằng tôi cần phải kết hợp các ràng buộc mẫu w/một ràng buộc tùy chỉnh mới có thể phá hủy/tái tạo các điều khiển tab tôi nghĩ. Tôi rất cảm kích sự giúp đỡ. Cảm ơn!

Trả lời

0

Bạn rất có thể sẽ phải trả lại giao diện tab mỗi khi mô hình thay đổi.

Ngoài ra, thêm một id duy nhất để các tab <ul>:

<ul id="tabs"> 

Mỗi lần thay đổi mô hình, gọi

$("#tabs").tabs(); 

(Tôi không chắc chắn làm thế nào để bắn ra một sự kiện với Knockout nhưng tôi chắc chắn nó nằm trong tài liệu.)

0

Tôi gặp vấn đề tương tự. Tôi có biểu đồ mô hình chế độ xem sâu, trong đó mảng mô hình con được quan sát ở cấp cao nhất được biểu diễn dưới dạng tab và mỗi tab sẽ hiển thị đánh dấu cho dữ liệu của cháu. Ban đầu tôi đã sử dụng các tab giao diện người dùng jQuery để tabify đánh dấu của tôi sau khi Knockout xây dựng nó.

Tôi có chức năng thêm, xóa và sao chép các kiểu xem/đối tượng tên miền theo thẻ này. Với các tab UI của jQuery, cuối cùng tôi phải gọi tiêu diệt nó và sau đó xây dựng lại nó, và đối với các trường hợp như Duplicate tôi phải lưu trữ chỉ mục đã chọn trước và sau đó chọn chỉ mục + 1 sau khi giải trí, để chọn tab mới được tạo. Nhưng bây giờ tôi đã đến với MVVM đầy đủ hơn là trình điều khiển giao diện người dùng của tôi và đã loại bỏ các tab jQuery hoàn toàn và ràng buộc các phần tử tab và phần tử nội dung tab của riêng tôi thành thuộc tính quan sát được "isSelected" trên các kiểu xem Knockout của tôi . Tôi đã tìm thấy điều này để được sạch hơn nhiều và mang lại cho tôi cách linh hoạt hơn, và đánh dấu/CSS cho các tab hóa ra là đơn giản và thanh lịch.

Đó là thuộc tính được chọn cũng có nghĩa là tôi có thể tăng hiệu quả ràng buộc bằng cách chỉ định một cái gì đó như <div class="child" data-bind="if: isSelected"> cho mỗi tab. Trước đây (có lẽ) Knockout là không cần thiết làm việc thông qua tất cả các ràng buộc của các tab vô hình.

Đây là cách tôi đang cố gắng tiếp cận giao diện người dùng của tôi nói chung ngay bây giờ - tránh các công cụ giao diện người dùng thủ tục trực tiếp càng nhiều càng tốt có lợi cho việc sử dụng các ràng buộc.

3

Tôi nghĩ tôi muốn cập nhật câu hỏi này với một giải pháp mới mà tôi đã bắt đầu sử dụng. Trước đây tôi đã sử dụng FIT của RP Niemeyer http://jsfiddle.net/rniemeyer/dsKbH/ làm cơ sở cho việc thêm/xóa các tab giao diện người dùng jQuery gắn với KO observableArray.

Trong vài tháng qua, tôi đã gặp phải một số sự cố trong ứng dụng liên quan đến A) SetTimeout() trì hoãn và B) Phá hủy và tạo lại tiện ích con tab mỗi lần cập nhật được kích hoạt. Vì vậy, tôi đã đưa ra một cách tiếp cận khác để tránh những vấn đề này, và IMHO, là một kỹ thuật thanh lịch hơn.

http://jsfiddle.net/LatencyMachine/XJPJZ/

Ý tưởng chính là để giới thiệu một phong tục rất đơn giản ràng buộc gọi là "TabPanel" và một widget tương ứng mà bạn liên kết với tab div nội dung bảng điều khiển của bạn. Khi KO tạo và loại bỏ các div này dựa trên observableArray của bạn, ràng buộc tabPanel đảm bảo cập nhật jQueryUI.tabs bằng cách sử dụng phương thức "refresh". Điều này làm việc rất nhiều mượt mà hơn tôi cố gắng để có được các tab để cập nhật (và vào đúng thời điểm) trong các ràng buộc của phần tử container.

mã có liên quan từ fiddle

/** 
KO Binding handler for a tabPanel div. Use this on divs that can appear/disappear and/or have their id change 
depending upon an observable, usually an observableArray. 
*/ 
ko.bindingHandlers.tabPanel = { 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {   
     $(element).tabPanel(ko.toJS(valueAccessor())); 
    } 
}; 

/** 
This widget facilitates jQuery UI tabs that appear and disappear dynamically, usually as a result of MVVM like Knockout 
Whenever this widget is created, the containing jQuery UI 'tabs' widget is refreshed so that it picks up the new tab 
or drops the removed one. 
This also facilitates dealing with id rename 'ripple' that occurs whenever a tab is removed due to the splice of an 
observable array. 
*/ 
$.widget("bw.tabPanel", { 
    options: { 
     id: null 
    }, 

    _create: function() { 
     this.element.hide(); 
     this.tabsElement = this.element.closest(".ui-tabs");   

     if(this.options.id) { 
      this.element.attr({id: this.options.id}); 
     } 
     this.refreshTabs(); 
    }, 

    _destroy: function() { 
     if(this.options.id) { 
      this.element.attr({id: ""}); 
     } 
     this.refreshTabs(); 
    }, 

    _setOption: function(key, value) { 
     var previousValue = this.options[key]; 
     if(previousValue == value) return; 

     this.options[key] = value; 

     switch(key) { 
      case "id": 
       this.element.attr({id: this.options.id}); 
       this.refreshTabs(); 
       break; 
     } 
    }, 

    /** 
    Invoke refresh on the parent tab to let it know that something has changed. 
    This also preserves the active index by setting it back to what it was before the refresh, which 
    may correspond to a different tab after the refresh. 
    */ 
    refreshTabs: function() { 
     var previousActiveIndex = this.tabsElement.tabs("option", "active"); 
     this.tabsElement.tabs("refresh"); 
     this.tabsElement.tabs("option", "active", previousActiveIndex);   
    } 
}); 
Các vấn đề liên quan