Hi Mark,
how about:
;;; ------------------------ ;;; *** Model MY-MODEL *** ;;; ------------------------
(defmd my-model () item-index :item-index (c-in 0))
(defobserver item-index ((self my-model)) (when new-value (format *debug-io* "~%~S: New value for slot item-index => ~S." self (item-index self))))
(defmacro mk-model (id) `(make-instance 'my-model :fm-parent *parent* :md-name ,id))
;;; ----------------------- ;;; *** Model MY-VIEW *** ;;; -----------------------
(defmd my-view () item-index)
(defmacro mk-view (id model-id) `(make-instance 'my-view :fm-parent *parent* :item-index (c? (let ((model (fm^ ,model-id))) ;; -> fm^ searches for model in the current family (item-index model))) :md-name ,id))
(defobserver item-index ((self my-view)) (when new-value (format *debug-io* "~%~S: New value for slot item-index => ~S." self (item-index self))))
;;; --------------------------- ;;; *** Family CONTROLLER *** ;;; ---------------------------
(defmd my-controller (family) )
(defmacro mk-controller (id view-id model-id) `(make-instance 'my-controller :kids (c? (the-kids (mk-model ,model-id) (mk-view ,view-id ,model-id))) :md-name ,id))
;;; ----------------- ;;; *** TESTING *** ;;; -----------------
(defun controller-test ()
(let* ((self (mk-controller :controller :view :model)) (model (fm-find-kid self :model)) (view (fm-find-kid self :view)))
(setf (item-index model) 1)
(values)))
Then:
CL-USER > (controller-test)
MODEL: New value for slot item-index => 0. VIEW: New value for slot item-index => 0. MODEL: New value for slot item-index => 1. VIEW: New value for slot item-index => 1.
?
Cheers Frank
Am 03.10.2012 um 03:47 schrieb Mark Cox:
G'day,
I think my mental model of Cells is wrong. Perhaps someone can help.
I have two model classes:
(defmodel model () ((item-index :initarg :item-index :accessor item-index)) (:default-initargs :item-index (c-in 0)))
(defmodel view () ((item-index :initarg :item-index :accessor item-index)) (:default-initargs :item-index (c-in 0)))
What I would like to do is to connect the item-index slot of an instance of MODEL to the item-index in an instance of VIEW. i.e.
(defun connect-model-and-view (model view) (setf (item-index view) (c? (item-index model))))
which does not appear to be possible.
I have navigated around the issue by introducing a third model class, CONTROLLER, that has an item-index slot initialised with (c? (item-index (^model))) and an observer that updates the view. However, I am wondering if this is the correct way as I seem to require inserting WITH-INTEGRITY in the observer.
Thanks Mark
cells-devel site list cells-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/cells-devel