Skip to content

Instantly share code, notes, and snippets.

View beyond-code-github's full-sized avatar

Pete Smith beyond-code-github

View GitHub Profile
@beyond-code-github
beyond-code-github / compounditeration.cs
Created January 21, 2014 21:23
Example of compound iteration when performing validation against loosely typed data
public List<string> Validate(IDictionary<string, object> data, List<Field> mandatoryFields)
{
var errors = new List<string>();
foreach (var field in mandatoryFields)
{
if (!data.Keys.Contains(field.Identifier))
{
errors.add(String.Format("The {0} field is required", field.Identifier);
}
@beyond-code-github
beyond-code-github / efficientiterator.cs
Last active January 4, 2016 01:38
Efficient Iterator sample
public class EfficientIterator<TOne, TTwo>
{
private Action<TOne, TTwo> always = (one, two) => { };
private Action<TOne, TTwo> match = (one, two) => { };
private Action<TOne> oneOnly = (one) => { };
private Action<TTwo> twoOnly = (two) => { };
private readonly Func<TOne, TTwo, int> compare;
public Action<TOne, TTwo> Always { set { this.always = value; } }
@beyond-code-github
beyond-code-github / efficientiteratortests.cs
Created January 21, 2014 22:09
Efficient iterator specifications
public class ItemA
{
public string Identifier { get; set; }
}
public class ItemB
{
public string Name { get; set; }
}
@beyond-code-github
beyond-code-github / changetrackedarray.js
Last active August 29, 2015 13:55
Skeleton change tracked array extender for knockout.kj
ko.extenders.trackArrayChange = function (target, track) {
if (track) {
target.isDirty = ko.observable(false);
target.added = ko.observableArray([]);
target.removed = ko.observableArray([]);
var addItem = function (item) {
//...
};
@beyond-code-github
beyond-code-github / arraysubscriptions.js
Last active August 29, 2015 13:55
Suscribing to array changes using the new arraychange subscriptions in knockout 3.0
//....
//....
target.getChanges = function () {
var result = {
added: target.added(),
removed: target.removed()
};
return result;
@beyond-code-github
beyond-code-github / addremoveexample.js
Last active August 29, 2015 13:55
Tracking array adds and removes is not quite as simple as it first appears...
// Initialise array with some data and track changes
var trackedArray = ko.observableArray([1,2,3]).extend({trackArrayChanges: true});
trackedArray.getChanges();
// -> { } No changes yet
trackedArray.push(4);
trackedArray.pop();
trackedArray.getChanges();
@beyond-code-github
beyond-code-github / applychangetracking.cs
Created January 31, 2014 19:54
Original code for applying change tracking to observables from Part 1
....
....
var applyChangeTrackingToObservable = function (observable) {
// Only apply to basic writeable observables
if (observable && !observable.nodeType && !observable.refresh && ko.isObservable(observable)) {
if (!observable.isDirty) observable.extend({ trackChange: true });
}
};
@beyond-code-github
beyond-code-github / applychangetrackingmodified.js
Last active August 29, 2015 13:55
Modified version of apply change tracking to observable that properly track arrays
//....
//....
var applyChangeTrackingToObservable = function (observable) {
// Only apply to basic writeable observables
if (observable && !observable.nodeType && !observable.refresh && ko.isObservable(observable)) {
if (observable.isObservableArray) {
observable.extend({ trackArrayChange: true });
}
else {
@beyond-code-github
beyond-code-github / example.js
Last active August 29, 2015 13:55
Example usage of change tracking in a complex view model, including a primitive array
var viewModel = {
Name: ko.observable("Pete"),
Age: ko.observable(29),
Skills: ko.observableArray([
"TDD", "Knockout", "WebForms"
}),
Occupation: ko.observable("Developer")
};
applyChangeTracking(viewModel);
@beyond-code-github
beyond-code-github / changetracking.js
Last active August 29, 2015 13:55
Change tracking implementation including support for primitive arrays
var getObjProperties = function (obj) {
var objProperties = [];
var val = ko.utils.unwrapObservable(obj);
if (val !== null && typeof val === 'object') {
for (var i in val) {
if (val.hasOwnProperty(i)) objProperties.push({ "name": i, "value": val[i] });
}
}