When this anchor is pressed:
html anchor onClick: (html updater id: someId ; callback: [ : r | self updateComponentTree. self renderSomethingOn: r]); with: 'do' ]. I find that #children is called BEFORE my #updateComponentTree. OK, so I think that #children probably has to be called before #renderSomethingOn. My question: when the anchor is clicked, how do I arrange for self updateComponentTree to execute before #children? Is there a way to have a separate callback for - updates to component tree (before #children) Vs. - re-rendering callback (after #children) Thanks, Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> My question: when the anchor is clicked, how do I arrange for
> self updateComponentTree > to execute before #children? Is there a way to have a separate callback for > - updates to component tree (before #children) Vs. > - re-rendering callback (after #children) Callbacks are always executed in the context of the defining component. So when callbacks are processed the whole component tree is traversed (using the information from #children) and the callbacks are triggered in the right order in the context of their owning component. That's why you get 'Components not found while processing callbacks' when you fail to specify #children correctly. I don't quite understand why you need to update the children before the callbacks are processed? Maybe you can provide a running example? Lukas -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
"Lukas Renggli" <[hidden email]> wrote in message
> I don't quite understand why you need to update the children before > the callbacks are processed? Maybe you can provide a running example? I have a tab panel (not SUTabPanel) with closable tabs. Its #children just returns the component in its currently #selected tab. When the #selected tab is closed, I want the following to happen: 1. remove #selected tab and its component from the component tree 2. change #selected to the next available tab (if any) Note: #children will changed after 2. 3. Re-render the tab panel downwards I think this requires doing 1, then #children, then 3. Am I approaching this wrong? Thanks! Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
In reply to this post by Lukas Renggli
"Lukas Renggli" <[hidden email]> wrote in message
> So when callbacks are processed the whole component tree is > traversed (using the information from #children) I think I understand the explanation. I'm still trying to figure out why my app code itself dies (and I'm not sure my tiny example captures the problem I am having ... I can now get the failure predictably on my actual app, but that would be a bit much to post :-( I will dig further ... this has been a quite difficult one for me. Many thanks - Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> I am having ... I can now get the failure predictably on my actual app, but
> that would be a bit much to post :-( What is the failure you get? > I will dig further ... this has been a quite difficult one for me. Usually it is a good strategy to make sure that the application works well without AJAX and then later on add that functionality, if necessary. Lukas -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
In reply to this post by Lukas Renggli
"Lukas Renggli" <[hidden email]> wrote in message
> Callbacks are always executed in the context of the defining > component. So when callbacks are processed the whole component tree is > traversed (using the information from #children) and the callbacks are > triggered in the right order in the context of their owning component. Given a component tree with [zoom] callback operation on C3: C1 C2 C3 [zoom] can the zoom callback on C3 C3>>zoom safely add a child component to C1? From your explanation it appears that #children has already been called on C1 & C2, before C3#zoom matches the callback search and executes ... and changes C1>>children ... a recipe for trouble? In my app an N-level deep sub-component, on 'Zoom', adds a new tab to the top-level tab panel. After this then things appear to break with Component-Not-Found. Please tell me there is a way to do this without losing Ajax :-) Thanks - Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
In reply to this post by Lukas Renggli
"Lukas Renggli" <[hidden email]> wrote in message
> What is the failure you get? In my app an N-level deep sub-component, on 'Zoom', adds a new tab to the top-level tab panel. After this then things appear to break with Component-Not-Found. (Sorry, our posts may have crossed earlier ... this from my other post:) Given a component tree with [zoom] callback operation on C3: C1 C2 C3 [zoom] can the zoom callback on C3 C3>>zoom safely add a child component to C1? From your explanation it appears that #children has already been called on C1 & C2, before C3#zoom matches the callback search and executes ... and changes C1>>children ... a recipe for trouble? Many Thanks - Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
In reply to this post by Sophie424
> Please tell me there is a way to do this without losing Ajax :-)
The question is, does your code works without AJAX? I did not ask to remove AJAX. It is just that if your problem might not be related to AJAX at all. Lukas -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
"Lukas Renggli" <[hidden email]> wrote in message
> The question is, does your code works without AJAX? Yes, it works without Ajax, and fails with Ajax. I just made a test (attached fileout) of child component modifying parent component structure. - Seaside 2.8 + SU, Squeak 3.9 - Hacks TheTabTestPanel as a global for the test - Try non-Ajax link, then click on tabs; - Try Ajax-links, then click on tabs. Only difference is Ajax. Thanks - Sophie begin 666 C1C2.st M3V)J96-T('-U8F-L87-S.B C04I486(-"6EN<W1A;F-E5F%R:6%B;&5.86UE M<SH@)VQA8F5L(&-O;7!O;F5N="<-"6-L87-S5F%R:6%B;&5.86UE<SH@)R<- M"7!O;VQ$:6-T:6]N87)I97,Z("<G#0EC871E9V]R>3H@)T,Q0S(G(0T-(4%* M5&%B(&UE=&AO9'-&;W(Z("=A8V-E<W-I;F<G('-T86UP.B G<VD@,2\Q-R\R M,# X(#$Y.C(R)R$-8V]M<&]N96YT#0E>(&-O;7!O;F5N="$@(0T-(4%*5&%B M(&UE=&AO9'-&;W(Z("=A8V-E<W-I;F<G('-T86UP.B G<VD@,2\Q-R\R,# X M(#$Y.C(R)R$-8V]M<&]N96YT.B!A;D]B:F5C=" -"6-O;7!O;F5N=" Z/2!A M;D]B:F5C="$@(0T-(4%*5&%B(&UE=&AO9'-&;W(Z("=A8V-E<W-I;F<G('-T M86UP.B G<VD@,2\Q-R\R,# X(#$Y.C(R)R$-;&%B96P-"5X@;&%B96PA("$- M#2%!2E1A8B!M971H;V1S1F]R.B G86-C97-S:6YG)R!S=&%M<#H@)W-I(#$O M,3<O,C P." Q.3HR,B<A#6QA8F5L.B!A;D]B:F5C=" -"6QA8F5L(#H](&%N M3V)J96-T(2 A#0T,#5=!0V]M<&]N96YT('-U8F-L87-S.B C04I486)086YE M; T):6YS=&%N8V5687)I86)L94YA;65S.B G:60@=&%B<R!S96QE8W1E9"<- M"6-L87-S5F%R:6%B;&5.86UE<SH@)R<-"7!O;VQ$:6-T:6]N87)I97,Z("<G M#0EC871E9V]R>3H@)T,Q0S(G(0T-(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@ M)V%S('EE="!U;F-L87-S:69I960G('-T86UP.B G<VD@,B\W+S(P,#@@,C$Z M-3,G(0UA9&0Z(&%#;VUP;VYE;G0@;&%B96PZ(&QA8F5L3W)";&]C:PT)?"!T M86(@? T)=&%B(#H]($%*5&%B(&YE=PT)"6QA8F5L.B!L86)E;$]R0FQO8VL@ M.PT)"6-O;7!O;F5N=#H@84-O;7!O;F5N=" [#0D)>6]U<G-E;&8N#0ET86)S M(&%D9#H@=&%B+@T)<V5L9B!S96QE8W1E9#H@=&%B(2 A#0TA04I486)086YE M;"!M971H;V1S1F]R.B G87,@>65T('5N8VQA<W-I9FEE9"<@<W1A;7 Z("=S M:2 R+S@O,C P." P,3HS-B<A#6-H:6QD<F5N#0E\(&MI9',@? T):VED<R Z M/2!!<G)A>2!W:71H.B!S96QF('-E;&5C=&5D(&-O;7!O;F5N="X-"5X@:VED M<R$@(0T-(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L87-S M:69I960G('-T86UP.B G<VD@,B\W+S(P,#@@,C,Z,34G(0UI9 T)7B!I9"$@ M(0T-(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L87-S:69I M960G('-T86UP.B G<VD@,B\W+S(P,#@@,C$Z-#4G(0UI;FET:6%L:7IE#0ES M=7!E<B!I;FET:6%L:7IE+@T)=&%B<R Z/2!/<F1E<F5D0V]L;&5C=&EO;B!N M97<N#2$@(0T-(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L M87-S:69I960G('-T86UP.B G<VD@,2\Q-R\R,# X(#$Y.C$S)R$-<F5M;W9E M5&%B.B!A5&%B#0DH=&%B<R!S:7IE(#X@,2D@:694<G5E.B!;=&%B<R!R96UO M=F4Z(&%486)=+@T)*'-E;&5C=&5D(#T](&%486(I(&EF5')U93H@6PT)"7-E M;&5C=&5D(#H](&YI;"X-"0ES96QF('-E;&5C=&5D(%TA("$-#2%!2E1A8E!A M;F5L(&UE=&AO9'-&;W(Z("=A<R!Y970@=6YC;&%S<VEF:65D)R!S=&%M<#H@ M)W-I(#(O-R\R,# X(#(S.C$T)R$-<F5N9&5R0F]D>4]N.B!H=&UL#0EH=&UL M('5N;W)D97)E9$QI<W0-"0EC;&%S<SH@)W1A8FYA=B<[#0D):60Z(&ED("P@ M)U]T86)S)R [#0D)=VET:#H@#0D)"5L@<V5L9B!R96YD97)486)S3VXZ(&AT M;6Q=+@T):'1M;"!D:78-"0EC;&%S<SH@)V)O9'DG.PT)"7=I=&@Z(%MS96QF M('-E;&5C=&5D(&EF3F]T3FEL.B!;(&AT;6P@<F5N9&5R.B!S96QF('-E;&5C M=&5D(&-O;7!O;F5N="!=72X-(2 A#0TA04I486)086YE;"!M971H;V1S1F]R M.B G87,@>65T('5N8VQA<W-I9FEE9"<@<W1A;7 Z("=S:2 R+S<O,C P." R M,SHQ,"<A#7)E;F1E<D-O;G1E;G1/;CH@:'1M;" -"6AT;6P@9&EV#0D):60Z M("AI9" Z/2!H=&UL(&YE>'1)9"D@.PT)"6-L87-S.B G=&%B<&%N96PG(#L- M"0EW:71H.B -"0D)6R!S96QF(')E;F1E<D)O9'E/;CH@:'1M;"!=(2 A#0TA M04I486)086YE;"!M971H;V1S1F]R.B G87,@>65T('5N8VQA<W-I9FEE9"<@ M<W1A;7 Z("=S:2 R+S@O,C P." P,3HS-B<A#7)E;F1E<E1A8G-/;CH@:'1M M; T)=&%B<R!D;SH@#0D)6R Z(&5A8V@@?" -"0EH=&UL(&QI<W1)=&5M#0D) M"6-L87-S.B G=&%B)R L("@H<V5L9B!S96QE8W1E9" ]/2!E86-H*0EI9E1R M=64Z(%L@)R!A8W1I=F4G(%T@:69&86QS93H@6R G)R!=*2 [#0D)"7=I=&@Z M( T)"0D)6R!H=&UL('-P86XZ( T)"0D)"5MH=&UL(&%N8VAO<@T)"0D)"6]N M0VQI8VLZ("AH=&UL('5P9&%T97(@:60Z(&ED(#L-"0D)"0D)"6-A;&QB86-K M.B!;(#H@<B!\( T)"0D)"0D)"7-E;&8@<V5L96-T960Z(&5A8V@N#0D)"0D) M"0D)<V5L9B!R96YD97)";V1Y3VXZ(&AT;6Q=*2 [#0D)"0D)=VET:#H@96%C M:"!L86)E;"!V86QU92X-"0D)"6AT;6P@86YC:&]R#0D)"0D);VY#;&EC:SH@ M*&AT;6P@=7!D871E<B!I9#H@:60@+" G7W1A8G,G(#L-"0D)"0D)8V%L;&)A M8VLZ(%L@.B!R('P@#0D)"0D)"0D)<V5L9B!R96UO=F5486(Z(&5A8V@N#0D) M"0D)"0D)<V5L9B!R96YD97)486)S3VXZ(&AT;6Q=*2 [#0D)"0D)=VET:#H@ M)W@G(%U=72$@(0T-(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U M;F-L87-S:69I960G('-T86UP.B G<VD@,2\Q-R\R,# X(#(R.C,Y)R$-<F5S M>6YC#0E\(&-O;7 @? T)<V5L9B!S96QE8W1E9"!I9DYO=$YI;#H@6R H8V]M M<" Z/2!S96QE8W1E9"!C;VUP;VYE;G0I( T)"6EF3F]T3FEL.B!;("AC;VUP M(')E<W!O;F1S5&\Z("-R97-Y;F,I(&EF5')U93H@6V-O;7 @<F5S>6YC(%U= M72$@(0T-(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L87-S M:69I960G('-T86UP.B G<VD@,B\W+S(P,#@@,C,Z,C8G(0US96QE8W1E9 T) M7B!S96QE8W1E9"!I9DYI;#H@6W-E;&5C=&5D(#H]("AT86)S(&EF3F]T14%* M5'DZ(%MT86)S(&9I<G-T72E=(&EF3F]T3FEL.B!;<V5L96-T961=(2 A#0TA M04I486)086YE;"!M971H;V1S1F]R.B G87,@>65T('5N8VQA<W-I9FEE9"<@ M<W1A;7 Z("=S:2 R+S<O,C P." R,SHR-B<A#7-E;&5C=&5D.B!A5&%B#0ES M96QE8W1E9" Z/2!A5&%B+@T)<V5L9B!R97-Y;F,A("$-#0TA04I486)086YE M;"!M971H;V1S1F]R.B G<F5N9&5R:6YG)R!S=&%M<#H@)W-I(#(O-R\R,# X M(# P.C,P)R$-<W1Y;&4@7B G#0UU;"YT86)N878@>R -"71E>'0M86QI9VXZ M(&QE9G0[#0EM87)G:6XZ(#%E;2 P(#%E;2 P.PT)9F]N=#H@8F]L9" Q,7!X M('9E<F1A;F$L(&%R:6%L+"!S86YS+7-E<FEF.PT)8F]R9&5R+6)O='1O;3H@ M,7!X('-O;&ED(",V8S8[#0EL:7-T+7-T>6QE+71Y<&4Z(&YO;F4[#0EP861D M:6YG.B S<'@@,3!P>" S<'@@,3!P>#L@+RH@5$A)4D0@;G5M8F5R(&UU<W0@ M8VAA;F=E('=I=&@@<F5S<&5C="!T;R!P861D:6YG+71O<" H6"D@8F5L;W<@ M*B\-?0T-=6PN=&%B;F%V(#X@;&D@>PT@(" @9&ES<&QA>3H@:6YL:6YE.PU] M#0TO*B!S971T:6YG<R!F;W(@<V5L96-T960@=&%B("HO#75L+G1A8FYA=B ^ M(&QI+F%C=&EV92![( T@(" @8F]R9&5R+6)O='1O;3H@,7!X('-O;&ED("-F M9F8[("\J(&)O<F1E<B!C;VQO<B ]('!A9V4@8F%C:V=R;W5N9" J+PT@(" @ M8F%C:V=R;W5N9"UC;VQO<CH@(V9F9CL@+RH@8F%C:V=R;W5N9"!C;VQO<B ] M(&)O<F1E<B!C;VQO<B J+PU]#0TO*B!S971T:6YG<R!F;W(@<V5L96-T960@ M=&%B(&QI;FL@*B\-=6PN=&%B;F%V(#X@;&DN86-T:79E('-P86X@>PT@(" @ M8F%C:V=R;W5N9"UC;VQO<CH@(V9F9CL@+RH@=&%B(&)A8VMG<F]U;F0@8V]L M;W(@9&5S:7)E9" J+PT@(" @8V]L;W(Z(",P,# [("\J('1A8B!L:6YK(&-O M;&]R(&%S(&1E<VER960@*B\-(" @('!O<VET:6]N.B!R96QA=&EV93L-(" @ M('1O<#H@,7!X.PT@(" @<&%D9&EN9RUT;W Z(#1P>#L@+RH@8VAA;F=E('=I M=&@@<F5S<&5C="!T;R!P861D:6YG("A8*2!A8F]V92!A;F0@8F5L;W<@*B\- M?0T-+RH@<V5T=&EN9W,@9F]R(&%L;"!T86(@;&EN:W,@*B\-=6PN=&%B;F%V M(#X@;&D@<W!A;B![#2 @("!P861D:6YG.B S<'@@-'!X.R O*B!S970@<&%D M9&EN9R H=&%B('-I>F4I(&%S(&1E<VER960[($9)4E-4(&YU;6)E<B!M=7-T M(&-H86YG92!W:71H(')E<W!E8W0@=&\@<&%D9&EN9RUT;W @*%@I(&%B;W9E M("HO#2 @("!B;W)D97(Z(#%P>"!S;VQI9" C-F,V.R O*B!S970@8F]R9&5R M($-/3$]2(&%S(&1E<VER960[('5S=6%L;'D@;6%T8VAE<R!B;W)D97(@8V]L M;W(@<W!E8VEF:65D(&EN("-T86)N878@*B\-(" @(&)A8VMG<F]U;F0M8V]L M;W(Z("-C9F,[("\J('-E="!U;G-E;&5C=&5D('1A8B!B86-K9W)O=6YD(&-O M;&]R(&%S(&1E<VER960@*B\-(" @(&-O;&]R.B C-C8V.R O*B!S970@=6YS M96QE8W1E9"!T86(@;&EN:R!C;VQO<B!A<R!D97-I<F5D("HO#2 @("!M87)G M:6XM<FEG:'0Z(#-P>#L@+RH@<V5T(&%D9&ET:6]N86P@<W!A8VEN9R!B971W M965N('1A8G,@87,@9&5S:7)E9" J+PT@(" @8F]R9&5R+6)O='1O;3H@;F]N M93L-?0T-=6PN=&%B;F%V(&$@>R!T97AT+61E8V]R871I;VXZ(&YO;F4[('T- M#75L+G1A8FYA=B!S<&%N.FAO=F5R('L@+RH@<V5T=&EN9W,@9F]R(&AO=F5R M(&5F9F5C=" J+PT@(" @8F%C:V=R;W5N9#H@(V9F9CL@+RH@<V5T(&1E<VER M960@:&]V97(@8V]L;W(@*B\-?0T-+RH@96YD(&-S<R!T86)S("HO#0T-#2<A M("$-#0P-04I486)086YE;"!S=6)C;&%S<SH@(T%*5&%B4&%N96Q497-T#0EI M;G-T86YC959A<FEA8FQE3F%M97,Z("<G#0EC;&%S<U9A<FEA8FQE3F%M97,Z M("<G#0EP;V]L1&EC=&EO;F%R:65S.B G)PT)8V%T96=O<GDZ("=#,4,R)R$- M#2%!2E1A8E!A;F5L5&5S="!M971H;V1S1F]R.B G87,@>65T('5N8VQA<W-I M9FEE9"<@<W1A;7 Z("=S:2 R+S@O,C P." P,CHU,2<A#6EN:71I86QI>F4- M"7-U<&5R(&EN:71I86QI>F4N#0E4:&5486)497-T4&%N96P@.CT@<V5L9BX) M#0ES96QF(&%D9#H@*%-50V]U;G1E<E1E<W0@;F5W*2!L86)E;#H@)W1A8B Q M)RX-"7-E;&[hidden email] H4U5#;W5N=&5R5&5S="!N97<I(&QA8F5L.B G=&%B M(#(G+@TA("$-#2%!2E1A8E!A;F5L5&5S="!M971H;V1S1F]R.B G87,@>65T M('5N8VQA<W-I9FEE9"<@<W1A;7 Z("=S:2 R+S@O,C P." P,CHP."<A#7)E M;F1E<D)O9'E/;CH@:'1M; T)<W5P97(@<F5N9&5R0F]D>4]N.B!H=&UL+@T) M:'1M;"!A;F-H;W(-"0EO;D-L:6-K.B H:'1M;"!U<&1A=&5R#0D)"6ED.B!I M9#L-"0D)8V%L;&)A8VLZ(%LZ<B!\( T)"0D)<V5L9B!A9&0Z("A354-O=6YT M97)497-T(&YE=RD@;&%B96PZ("=A;F]T:&5R)RX-"0D)"7-E;&8@<F5N9&5R M0F]D>4]N.B!R72D[#0D)=VET:#H@)V%D9"<N(2 A#0TB+2T@+2T@+2T@+2T@ M+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@+2T@(B$- M#4%*5&%B4&%N96Q497-T(&-L87-S#0EI;G-T86YC959A<FEA8FQE3F%M97,Z M("<G(0T-(4%*5&%B4&%N96Q497-T(&-L87-S(&UE=&AO9'-&;W(Z("=A<R!Y M970@=6YC;&%S<VEF:65D)R!S=&%M<#H@)W-I(#(O-R\R,# X(#(Q.C0W)R$- M8V%N0F52;V]T#0E>('1R=64A("$-#2%!2E1A8E!A;F5L5&5S="!C;&%S<R!M M971H;V1S1F]R.B G87,@>65T('5N8VQA<W-I9FEE9"<@<W1A;7 Z("=S:2 R M+S@O,C P." P-#HT-B<A#6EN:71I86QI>F4-"7P@87!P('P-"6%P<" Z/2!S M96QF(')E9VES=&5R07-!<'!L:6-A=&EO;CH@(V,Q8S(N#0EA<' @861D3&EB M<F%R>3H@4U5,:6)R87)Y+@T)(2 A#0T,#5-51G5N8W1I;VYA;%1E<W0@<W5B M8VQA<W,Z("-354-O=6YT97)497-T#0EI;G-T86YC959A<FEA8FQE3F%M97,Z M("=C;W5N="<-"6-L87-S5F%R:6%B;&5.86UE<SH@)R<-"7!O;VQ$:6-T:6]N M87)I97,Z("<G#0EC871E9V]R>3H@)T,Q0S(G(0T-(5-50V]U;G1E<E1E<W0@ M;65T:&]D<T9O<CH@)V%C=&EO;G,G('-T86UP.B G;'(@,R\Q,B\R,# V(#$S M.C(S)R$-9&5C<F5A<V4-"6-O=6YT(#H](&-O=6YT("T@,2$@(0T-(5-50V]U M;G1E<E1E<W0@;65T:&]D<T9O<CH@)V%C=&EO;G,G('-T86UP.B G;'(@,R\Q M,B\R,# V(#$S.C(S)R$-:6YC<F5A<V4-"6-O=6YT(#H](&-O=6YT("L@,2$@ M(0T-#2%354-O=6YT97)497-T(&UE=&AO9'-&;W(Z("=I;FET:6%L:7IA=&EO M;B<@<W1A;7 Z("=L<B S+S$R+S(P,#8@,3,Z,C,G(0UI;FET:6%L:7IE#0ES M=7!E<B!I;FET:6%L:7IE+@T)8V]U;G0@.CT@,"$@(0T-#2%354-O=6YT97)4 M97-T(&UE=&AO9'-&;W(Z("=R96YD97)I;F<G('-T86UP.B G<VD@,B\X+S(P M,#@@,#0Z-#,G(0UR96YD97)#;VYT96YT3VXZ(&AT;6P-"7P@:60@? T):60@ M.CT@:'1M;"!N97AT260N#0EH=&UL('!A<F%G<F%P:#H@6PT)"6AT;6P@<W!A M;@T)"0EI9#H@)V-O=6YT97)?)R L(&ED.PT)"0EW:71H.B!C;W5N="X-"0EH M=&UL('-P86-E+@T)"6AT;6P@86YC:&]R#0D)"6]N0VQI8VLZ("AH=&UL('5P M9&%T97(-"0D)"6ED.B G8V]U;G1E<E\G("P@:60[#0D)"0EC86QL8F%C:SH@ M6R Z<F5N9&5R('P@<V5L9B!I;F-R96%S93L@<F5N9&5R0V]U;G1/;CH@<F5N M9&5R(%TI.PT)"0EW:71H.B G*RLG+@T)"6AT;6P@<W!A8V4N#0D):'1M;"!A M;F-H;W(-"0D);VY#;&EC:SH@*&AT;6P@=7!D871E<@T)"0D):60Z("=C;W5N M=&5R7R<@+"!I9#L-"0D)"6-A;&QB86-K.B!;(#IR96YD97(@?"!S96QF(&1E M8W)E87-E.R!R96YD97)#;W5N=$]N.B!R96YD97(@72D[#0D)"7=I=&@Z("<M M+2<@72X-#0EH=&UL(&1I=CH@6VAT;6P@86YC:&]R#0D)8V%L;&)A8VLZ(%M4 M:&5486)497-T4&%[hidden email] H4U5#;W5N=&5R5&5S="!N97<I(&QA8F5L M.B G86YO=&AE<B==.PT)"7=I=&@Z("=N;VXM86IA>"!A9&0@9G)O;2!N97-T M960@4U5#;W5N=&5R)RY=+@T)"0T):'1M;"!D:78Z(%MH=&UL(&%N8VAO<@T) M"6]N0VQI8VLZ("AH=&UL('5P9&%T97(-"0D):60Z(%1H951A8E1E<W1086YE M;"!I9#L-"0D)8V%L;&)A8VLZ(%LZ<B!\( T)"0D)5&AE5&%B5&5S=%!A;F5L M(&%D9#H@*%-50V]U;G1E<E1E<W0@;F5W*2!L86)E;#H@)V%N;W1H97(G+@T) M"0D)5&AE5&%B5&5S=%!A;F5L(')E;F1E<D)O9'E/;CH@<ETI.PT)"7=I=&@Z M("=!2D%8(&%D9"!F<F]M(&YE<W1E9"!354-O=6YT97(G+ETN(2 A#0TA4U5# M;W5N=&5R5&5S="!M971H;V1S1F]R.B G<F5N9&5R:6YG)R!S=&%M<#H@)VQR M(#,O,3(O,C P-B Q,SHR-B<A#7)E;F1E<D-O=6YT3VXZ(&AT;6P-"6AT;6P@ L<F5N9&5R.B!C;W5N="$@(0T-04I486)086YE;%1E<W0@:6YI=&EA;&EZ92$` ` end _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> > The question is, does your code works without AJAX?
> > Yes, it works without Ajax, and fails with Ajax. Ok, I will have a look. > begin 666 C1C2.st > M3V)J96-T('-U8F-L87-S.B C04I486(-"6EN<W1A;F-E5F%R:6%B;&5.86UE > M<SH@)VQA8F5L(&-O;7!O;F5N="<-"6-L87-S5F%R:6%B;&5.86UE<SH@)R<- > M"7!O;VQ$:6-T:6]N87)I97,Z("<G#0EC871E9V]R>3H@)T,Q0S(G(0T-(4%* How do I get that noise of characters into my Squeak image? Lukas :-S -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
On Fri, 8 Feb 2008 12:17:21 +0100
"Lukas Renggli" <[hidden email]> wrote: > > begin 666 C1C2.st > > M3V)J96-T('-U8F-L87-S.B C04I486(-"6EN<W1A;F-E5F%R:6%B;&5.86UE > > M<SH@)VQA8F5L(&-O;7!O;F5N="<-"6-L87-S5F%R:6%B;&5.86UE<SH@)R<- > > M"7!O;VQ$:6-T:6]N87)I97,Z("<G#0EC871E9V]R>3H@)T,Q0S(G(0T-(4%* > > How do I get that noise of characters into my Squeak image? uudecode works wonders when being fed this. ahhh... those were the times :-) s. _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> uudecode works wonders when being fed this.
Geeky stuff ;-) With the uuencoded patch I cannot re-produce the errors anymore: - declare all tab components as children (!) - when a tab panel is removed, also update the tab panel - avoid throwing an error when the same tab panel is close twice - removed unknown message-send from #selected (Sophie probably wants to skip this step) Cheers, Lukas begin 644 C2C3.cs M)T9R;VT@4W%U96%K,RXY(&]F(#<@3F]V96UB97(@,C`P-B!;;&%T97-T('5P M9&%T93H@(S<P-C==(&]N(#@@1F5B<G5A<GD@,C`P."!A="`Q.C0P.C$S('!M M)R$-#2%!2E1A8E!A;F5L(&UE=&AO9'-&;W(Z("=A<R!Y970@=6YC;&%S<VEF M:65D)R!S=&%M<#H@)VQR(#(O."\R,#`X(#$S.C,R)R$-8VAI;&1R96X-"5X@ M=&%B<R!C;VQL96-T.B!;(#IE('P@92!C;VUP;VYE;G0@72$@(0T-(4%*5&%B M4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L87-S:69I960G('-T86UP M.B`G;'(@,B\X+S(P,#@@,3,Z,S<G(0UR96UO=F5486(Z(&%486(-"2AT86)S M('-I>F4@/B`Q*2!I9E1R=64Z(%MT86)S(')E;6]V93H@851A8B!I9D%B<V5N M=#H@6R!>('-E;&8@75TN#0DH<V5L96-T960@/3T@851A8BD@:694<G5E.B!; M#0D)<V5L96-T960@.CT@;FEL+@T)"7-E;&8@<V5L96-T960@72$@(0T-(4%* M5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L87-S:69I960G('-T M86UP.B`G;'(@,B\X+S(P,#@@,3,Z,S8G(0UR96YD97)486)S3VXZ(&AT;6P- M"71A8G,@9&\Z(`T)"5L@.B!E86-H('P@#0D):'1M;"!L:7-T271E;0T)"0EC M;&%S<SH@)W1A8B<@+"`H*'-E;&8@<V5L96-T960@/3T@96%C:"D):694<G5E M.B!;("<@86-T:79E)R!=(&EF1F%L<V4Z(%L@)R<@72D@.PT)"0EW:71H.B`- M"0D)"5L@:'1M;"!S<&%N.B`-"0D)"0E;:'1M;"!A;F-H;W(-"0D)"0EO;D-L M:6-K.B`H:'1M;"!U<&1A=&5R(&ED.B!I9"`[#0D)"0D)"0EC86QL8F%C:SH@ M6R`Z('(@?"`-"0D)"0D)"0ES96QF('-E;&5C=&5D.B!E86-H+@T)"0D)"0D) M"7-E;&8@<F5N9&5R0F]D>4]N.B!H=&UL72D@.PT)"0D)"7=I=&@Z(&5A8V@@ M;&%B96P@=F%L=64N#0D)"0EH=&UL(&%N8VAO<@T)"0D)"6]N0VQI8VLZ("AH M=&UL('5P9&%T97(@:60Z(&ED(#L-"0D)"0D)8V%L;&)A8VLZ(%L@.B!R('P@ M#0D)"0D)"0D)<V5L9B!R96UO=F5486(Z(&5A8V@N#0D)"0D)"0D)<V5L9B!R M96YD97)";V1Y3VXZ(&AT;6Q=*2`[#0D)"0D)=VET:#H@)W@G(%U=72$@(0T- M(4%*5&%B4&%N96P@;65T:&]D<T9O<CH@)V%S('EE="!U;F-L87-S:69I960G M('-T86UP.B`G;'(@,B\X+S(P,#@@,3,Z,C@G(0US96QE8W1E9`T)7B!S96QE M8W1E9"!I9DYI;#H@6W-E;&5C=&5D(#H]('1A8G,@9FER<W1=(&EF3F]T3FEL 1.B!;<V5L96-T961=(2`A#0T` ` end -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
"Lukas Renggli" <[hidden email]> wrote in message
> - declare all tab components as children (!) Yes, this does work, but I don't understand why it is necessary. #renderContentOn: will only #render: the #selected tab, never any of the others. (I mainly want to understand the right way ... but also worry about scale: does the total size of the component tree matter, or just the size of #children of any one node?) > - when a tab panel is removed, also update the tab panel > - avoid throwing an error when the same tab panel is close twice > - removed unknown message-send from #selected (Sophie probably wants > to skip this step) Yes. Thank you very much! Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> > - declare all tab components as children (!)
> > Yes, this does work, but I don't understand why it is necessary. > #renderContentOn: will only #render: the #selected tab, never any of the > others. Let's face it, it is complicated and Seaside doesn't get it quite right ;-) Callbacks are normally processed in the context of the component that defines them (the owner). In the code below you directly call a foreign rendering method: html div: [html anchor onClick: (html updater id: TheTabTestPanel id; callback: [:r | TheTabTestPanel add: (SUCounterTest new) label: 'another'. TheTabTestPanel renderBodyOn: r]); with: 'AJAX add from nested SUCounter'.]. Then the problem is that the owner of all callbacks in your tab panel is the SUCounter that just disappeared. And there is nobody that takes care of these callbacks. Bummer. Seaside 2.9 already takes a step in the direction of fixing that kind of problems. It supports so called 'homeless callbacks' that can be incredibly useful when you want define a callback from a file-library (or something else that is not the callback processing chain). I guess this solution could be applied to this problem as well and would solve many sleepless nights. Thanks for providing such a nice example to reproduce this problem. > (I mainly want to understand the right way ... but also worry about scale: > does the total size of the component tree matter, or just the size of > #children of any one node?) This is usually not a problem, if you have a moderate number of children. > > - when a tab panel is removed, also update the tab panel > > - avoid throwing an error when the same tab panel is close twice > > - removed unknown message-send from #selected (Sophie probably wants > > to skip this step) > > Yes. Pay attention to use the right renderer. Even if it mostly works, I just noticed that there are some places where you use html within an AJAX callback. Lukas -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
"Lukas Renggli" <[hidden email]> wrote in message
> the owner of all callbacks in your tab panel > is the SUCounter that just disappeared. And there is > nobody that takes care of these callbacks. Bummer. Ah. This could make some kinds of Ajax difficult. > I guess > this solution could be applied to this problem as well and would solve > many sleepless nights. That would be great! Callback problems are the most difficult part of Seaside for me to debug. > Thanks for providing such a nice example to > reproduce this problem. My pleasure, its good to find some good side to my bad programming :-) Below might be another pattern: an operation on (the domain model of) a parent component is actually presented on a child component (the parent configures the child). House>>deleteRoom: aRoom HouseComponent (model=house) RoomComponent 1 (model=r1) ['delete'->[house deleteRoom:r1. rend render: houseComponent]] RoomComponent 2 (model=r2) ['delete'->[house deleteRoom:r2. rend render: houseComponent]] e.g. Desktop compound-document/component systems allow elements to negotiate with parents/children/root about where menus appear. It would be awesome if Seaside's architecture enabled similar composition flexibility. It would mean that... > Callbacks are normally processed in the context of the component that > defines them (the owner). ... the component that presents a callback need not be the one that "defined/owns" it. Not so much "homeless", more like "bind-and-relocate" (bind: r1 or r2, relocate: from house to r1, r2). Perhaps seaside components have a special notion of "environment" that could be made explicit? > This is usually not a problem, if you have a moderate number of children. Good to know. > Pay attention to use the right renderer. Even if it mostly works, I > just noticed that there are some places where you use html within an > AJAX callback. Yikes! Even *I* should know better than to do that. A Lint smell? As always, with many thanks. Sophie _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> > Callbacks are normally processed in the context of the component that
> > defines them (the owner). > > ... the component that presents a callback need not be the one that > "defined/owns" it. Not so much "homeless", more like "bind-and-relocate" > (bind: r1 or r2, relocate: from house to r1, r2). Yes, why not. The updater could be written like: html updater id: TheTabTestPanel id; callback: [:r | r withOwner: anotherComponent do: [ anotherComponent add: (SUCounterTest new) label: 'another'. anotherComponent renderBodyOn: r ] ]); with: 'AJAX add from nested SUCounter' ] The question is rather, if I want to explain that to anybody ;-) > > Pay attention to use the right renderer. Even if it mostly works, I > > just noticed that there are some places where you use html within an > > AJAX callback. > > Yikes! Even *I* should know better than to do that. A Lint smell? The latest version of Slime detects that kind of bug. Thanks for the idea. Lukas -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
2008/2/9, Lukas Renggli <[hidden email]>:
> > > Callbacks are normally processed in the context of the component that > > > defines them (the owner). > > > > ... the component that presents a callback need not be the one that > > "defined/owns" it. Not so much "homeless", more like "bind-and-relocate" > > (bind: r1 or r2, relocate: from house to r1, r2). > > Yes, why not. The updater could be written like: > > html updater > id: TheTabTestPanel id; > callback: [:r | > r withOwner: anotherComponent do: [ > anotherComponent add: (SUCounterTest new) label: 'another'. > anotherComponent renderBodyOn: r ] ]); > with: 'AJAX add from nested SUCounter' ] > > The question is rather, if I want to explain that to anybody ;-) Write a book about it ;-) Cheers Philippe > > > Pay attention to use the right renderer. Even if it mostly works, I > > > just noticed that there are some places where you use html within an > > > AJAX callback. > > > > Yikes! Even *I* should know better than to do that. A Lint smell? > > The latest version of Slime detects that kind of bug. Thanks for the idea. > > Lukas > > > -- > Lukas Renggli > http://www.lukas-renggli.ch > _______________________________________________ > seaside mailing list > [hidden email] > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
>>>
>> >> html updater >> id: TheTabTestPanel id; >> callback: [:r | >> r withOwner: anotherComponent do: [ >> anotherComponent add: (SUCounterTest new) label: >> 'another'. >> anotherComponent renderBodyOn: r ] ]); >> with: 'AJAX add from nested SUCounter' ] >> >> The question is rather, if I want to explain that to anybody ;-) > > Write a book about it ;-) Book would be time-consuming and expensive. :-) But small pattern booklet showing people how to solve their tasks in Seaside would be very useful. _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
In reply to this post by Lukas Renggli
> > > Callbacks are normally processed in the context of the component that
Maybe the TabTestPanel could go in the examples as a start ?
> > > defines them (the owner). > > > > ... the component that presents a callback need not be the one that > > "defined/owns" it. Not so much "homeless", more like "bind-and-relocate" > > (bind: r1 or r2, relocate: from house to r1, r2). > > Yes, why not. The updater could be written like: > > html updater > id: TheTabTestPanel id; > callback: [:r | > r withOwner: anotherComponent do: [ > anotherComponent add: (SUCounterTest new) label: 'another'. > anotherComponent renderBodyOn: r ] ]); > with: 'AJAX add from nested SUCounter' ] > > The question is rather, if I want to explain that to anybody ;-) Would you plan adding this feature ? Is it complementary to the homeless callback ? Maybe changing the callback method name would help to understand., maybe having a keyword (#callback:inComponent:). Anyway, thanks for the explanation and discussion. This is always interesting :) Cédrick _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
> > The question is rather, if I want to explain that to anybody ;-)
> > Maybe the TabTestPanel could go in the examples as a start ? > Would you plan adding this feature ? Is it complementary to the > homeless callback ? Maybe, if we find a satisfactory solution. > Maybe changing the callback method name would help to understand., > maybe having a keyword (#callback:inComponent:) That doesn't work, because a callback could render to many components. Lukas -- Lukas Renggli http://www.lukas-renggli.ch _______________________________________________ seaside mailing list [hidden email] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside |
Free forum by Nabble | Edit this page |