Skip to content

Commit

Permalink
Make sure a null afterRender doesn't fail + add some tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mbest committed Oct 17, 2017
1 parent bf48f00 commit b7decfd
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 6 deletions.
5 changes: 5 additions & 0 deletions spec/bindingAttributeBehaviors.js
Expand Up @@ -621,4 +621,9 @@ describe('Binding attribute syntax', function() {
ko.applyBindings({ callback: function () { callbacks++; } }, testNode);
expect(callbacks).toEqual(0);
});

it('Should ignore (and not throw an error) for a null afterRender callback', function () {
testNode.innerHTML = "<div data-bind='afterRender: null'><span data-bind='text: \"Some Text\"'></span></div>";
ko.applyBindings({}, testNode);
});
});
32 changes: 32 additions & 0 deletions spec/bindingDependencyBehaviors.js
Expand Up @@ -289,6 +289,38 @@ describe('Binding dependencies', function() {
expect(callbacks).toEqual(2);
});

it('Should always use the latest value of an afterRender callback', function () {
ko.bindingHandlers.test = {
init: function() {
return { controlsDescendantBindings: true };
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var innerContext = bindingContext.createChildContext({childprop: ko.utils.unwrapObservable(valueAccessor())});
element.innerHTML = "<span data-bind='text: childprop'></span>";
ko.applyBindingsToDescendants(innerContext, element);
}
};

var callbackSpy1 = jasmine.createSpy('callbackSpy1'),
callbackSpy2 = jasmine.createSpy('callbackSpy2'),
vm = {
observable: ko.observable('value'),
callback: callbackSpy1
};

testNode.innerHTML = "<div data-bind='test: observable, afterRender: callback'></div>";
ko.applyBindings(vm, testNode);
expect(callbackSpy1).toHaveBeenCalled();

callbackSpy1.reset();
vm.callback = callbackSpy2;

vm.observable('new value');
expect(testNode.childNodes[0]).toContainText('new value');
expect(callbackSpy1).not.toHaveBeenCalled();
expect(callbackSpy2).toHaveBeenCalled();
});

describe('Observable view models', function() {
it('Should update bindings (including callbacks)', function() {
var vm = ko.observable(), clickedVM;
Expand Down
15 changes: 9 additions & 6 deletions src/binding/bindingAttributeSyntax.js
Expand Up @@ -235,12 +235,15 @@

var afterRender = ko.utils.domData.get(elementOrVirtualElement, afterRenderCallbackDomDataKey);
if (afterRender) {
var nodes = ko.virtualElements.childNodes(elementOrVirtualElement);
if (nodes.length) {
ko.dependencyDetection.ignore(function () {
evaluateValueAccessor(afterRender)(nodes, ko.dataFor(nodes[0]));
});
}
ko.dependencyDetection.ignore(function () {
afterRender = evaluateValueAccessor(afterRender);
if (afterRender) {
var nodes = ko.virtualElements.childNodes(elementOrVirtualElement);
if (nodes.length) {
afterRender(nodes, ko.dataFor(nodes[0]));
}
}
});
}
}
}
Expand Down

0 comments on commit b7decfd

Please sign in to comment.