Example #1
0
        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;
        }
Example #2
0
        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)));
        }