/
observableArray.js
79 lines (68 loc) · 2.79 KB
/
observableArray.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/// <reference path="observable.js" />
ko.observableArray = function (initialValues) {
var result = new ko.observable(initialValues);
ko.utils.arrayForEach(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (methodName) {
result[methodName] = function () {
var underlyingArray = result();
var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments);
result.valueHasMutated();
return methodCallResult;
};
});
ko.utils.arrayForEach(["slice"], function (methodName) {
result[methodName] = function () {
var underlyingArray = result();
return underlyingArray[methodName].apply(underlyingArray, arguments);
};
});
result.remove = function (valueOrPredicate) {
var underlyingArray = result();
var remainingValues = [];
var removedValues = [];
var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
for (var i = 0, j = underlyingArray.length; i < j; i++) {
var value = underlyingArray[i];
if (!predicate(value))
remainingValues.push(value);
else
removedValues.push(value);
}
result(remainingValues);
return removedValues;
};
result.removeAll = function (arrayOfValues) {
if (!arrayOfValues)
return [];
return result.remove(function (value) {
return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
});
};
result.destroy = function (valueOrPredicate) {
var underlyingArray = result();
var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
for (var i = underlyingArray.length - 1; i >= 0; i--) {
var value = underlyingArray[i];
if (predicate(value))
underlyingArray[i]["_destroy"] = true;
}
result.valueHasMutated();
};
result.destroyAll = function (arrayOfValues) {
if (!arrayOfValues)
return [];
return result.destroy(function (value) {
return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
});
};
result.indexOf = function (item) {
var underlyingArray = result();
return ko.utils.arrayIndexOf(underlyingArray, item);
};
ko.exportProperty(result, "remove", result.remove);
ko.exportProperty(result, "removeAll", result.removeAll);
ko.exportProperty(result, "destroy", result.destroy);
ko.exportProperty(result, "destroyAll", result.destroyAll);
ko.exportProperty(result, "indexOf", result.indexOf);
return result;
}
ko.exportSymbol('ko.observableArray', ko.observableArray);