Jason Evans
Jason Evans

Reputation: 29186

Having trouble with jQueryUI accordion and Knockoutjs

I've been able to replicate the problem here: http://jsfiddle.net/NE6dm/

I have the following HTML which I'm using in an app:

<div data-bind="foreach: items, jqAccordion: { active: false, collapsible: true }">
        <h3>
            <a href="#" data-bind="text: title"></a>
        </h3>
        <div>    
            hello
        </div> 
</div>
<button title="Click to return to the complaints list." data-bind="click: addItem">Add Item</button>

The idea is to display an accordion for a bunch of items that will dynamically be added/removed via a Knockout observable array.

Here's some JavaScript code which I use:

// Tab.
var tab = function (questionSet) {
    this.id = questionSet.code;
    this.title = questionSet.description;
    this.questionSet = questionSet;
};

Custom Knockout binding handler:

ko.bindingHandlers.jqAccordion = {
        init: function (element, valueAccessor) {
            var options = valueAccessor();
            $(element).accordion(options);
            $(element).bind("valueChanged", function () {
                ko.bindingHandlers.jqAccordion.update(element, valueAccessor);
            });
        },
        update: function (element, valueAccessor) {
            var options = valueAccessor();
            $(element).accordion('destroy').accordion(options);
        }
    };

var NonSequentialViewModel = function () {
    var items = ko.observableArray();

    items.push(new tab({ id: 23, description : 'Added Inline' }));

    var addItem = function() {
        items.push(new tab({ id: 5, description: 'Added by a click' }));
    };

    return {
        addItem: addItem,
        items: items
    }
}

var nonsequentialViewModel = new NonSequentialViewModel();    

ko.applyBindings(nonsequentialViewModel);

Now the problem is this - when I view the HTML page, the item 'Added Inline' appears fine, in that I can collapse and expand it. However, when I click the button 'Add Item', a new item is added to he accordion, but it has not styling at all. For example:

enter image description here

In the above image, the first item is styled correctly, however the remaining items have none of the jQuery UI styling applied. Basically, any item which is added dynamically does not have any accordion styling applied.

I have seen this question

knockout.js and jQueryUI to create an accordion menu

and I've tried using the jsFiddle included in the question, but I cannot see why my code doesn't have the same result.

I'm hoping someone else has experienced this before and can help.

EDIT:

I've looked into this further and see that the problem is this - when I add a new item to the oservable array, the custom handler's update method is not executed. Thus the redrawing of the accordion never happens.

I can't see why the update should not be called. This is realyl doing my head in! :)

EDIT: I've been able to replicate the problem here: http://jsfiddle.net/NE6dm/

Upvotes: 0

Views: 1386

Answers (2)

Randy James
Randy James

Reputation: 1480

Old question, but I believe I was having the same problem. I may need to submit a bug to knockout.js. I just spend several hours trying to figure out similar problems.

In short... if I load your jsfiddle and change the version of knockout to 2.1.0, it appears to work fine. this:

<script type="text/javascript" src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.2.0.debug.js"></script>

to this:

<script type="text/javascript" src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.debug.js"></script>

(The only difference being the version 2.2.0 --> 2.1.0)

Further... I ended up settling on several versions: jquery: 1.9.1 jquery-ui (combined): 1.9.2 knockoutjs: 2.1.0

Upvotes: 0

Artem Vyshniakov
Artem Vyshniakov

Reputation: 16465

Your NonSequentialViewModel constructor doesn't return items array. Update return statement to this:

return {
    items: items,
    addItem: addItem
}

Here is working fiddle: http://jsfiddle.net/vyshniakov/MfegM/323/

Upvotes: 1

Related Questions