private RenderNode RegisterItem(object instance, RenderNode dependent) { if (instance == null) return null; RenderNode result; if (!_items.TryGetValue(instance, out result)) { IEnumerable<object> elements; switch (_strategy.ClassifyInstance(instance, out elements)) { case InstanceType.Object: result = new ObjectOrValueNode(instance, _nextId++, false); break; case InstanceType.Value: result = new ObjectOrValueNode(instance, _nextId++, true); break; case InstanceType.Link: result = new LinkNode(instance, _nextId++); break; case InstanceType.Collection: var collection = new CollectionNode(instance, _nextId++); result = collection; collection.Elements.AddRange(elements.Select(x => RegisterItem(x, result))); break; } if (result != null) { _items[instance] = result; _newItems.Enqueue(result); } } if (result != null && dependent != null) // TODO: consider requiring non null { result.Dependents.Add(dependent); dependent.Dependencies.Add(result); } return result; }
protected string RenderValue(CollectionNode node) { var status = _renderSchedule.GetStatus(node); status.HasEmitted = true; return string.Format("ko.observableArray([{0}])", string.Join(",", node.Elements.Select(Render))); }