Skip to content

Commit

Permalink
Added merging of observable arrays in
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown authored and unknown committed Jun 16, 2015
1 parent e7a1380 commit 980645c
Showing 1 changed file with 26 additions and 1 deletion.
27 changes: 26 additions & 1 deletion src/knockout.merge.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,21 @@
knockoutElement.mergeMethod(knockoutElement, dataElement);
} else if(knockoutElement.mergeRule) {
var mergeMethod = getMethodForMergeRule(knockoutElement.mergeRule);
if(mergeMethod) { mergeMethod(knockoutElement, dataElement); }
if(mergeMethod) {
mergeMethod(knockoutElement, dataElement);
}
} else if(isObservableArray(knockoutElement) && isArray(dataElement)) {
// If we have an observable array and a data element which is an array
// then we need to merge the values item by item
for(var i = 0; i < dataElement.length; i++) {
if(i >= knockoutElement().length) {
var placeholder = {};
exports.fromJS(placeholder, dataElement[i]);
knockoutElement.push(placeholder);
} else {
exports.fromJS(knockoutElement()[i], dataElement[i]);
}
}
} else {
knockoutElement(dataElement);
}
Expand All @@ -40,6 +54,17 @@
}
};

var isObservableArray = function(koElement) {
// Determine if the knockout element is an observable array - based upon
// impelemntation suggested at https://github.com/knockout/knockout/issues/619
return ko.isObservable(koElement) && !(koElement.destroyAll === undefined);
};

var isArray = function(dataElement) {
// Determine if the given data item is an array
return Object.prototype.toString.call(dataElement) === '[object Array]';
};

var getMethodForMergeRule = function(mergeRule) {
for(var property in exports.rules)
{
Expand Down

0 comments on commit 980645c

Please sign in to comment.