I think you're specifying the target div name in the wrong place. Instead
of:
{{=LOAD('default', 'blog_comment_show.load', args = page.id, ajax = True)}}
{{=LOAD('default', 'blog_comment_add.load', args = page.id,
target = 'comments_%s hidden' % page.id, ajax = True)}}
I think you want:
{{=LOAD('default', 'blog_comment_show.load', args = page.id,
target = 'comments_%s hidden' % page.id, ajax = True)}}
{{=LOAD('default', 'blog_comment_add.load', args = page.id, ajax = True)}}
Does that change help?
Also, in __add_2(), you might want to return response.js conditionally, only
when a new comment has actually been added -- otherwise, when the page first
loads, the blog_comment_show() component will be called/load twice (once
because of the LOAD, and once because of the response.js from the
blog_component_add() component).
If you're still having problems, I recommend creating a simplified version
of the setup just to see if you can get the basic inter-component
communication working -- then add in all the complexity and see where it
breaks down.
Anthony
On Saturday, June 11, 2011 12:46:29 AM UTC-4, 黄祥 wrote:
> yes, i have.
>
> def blog_comment_show():
> return
> __show_2(blog, blog_index, blog_comment, blog_comment_blog_id,
> blog_comment_active)
>
> @auth.requires_login()
> def __show_2(table_0, index_link, table_1, field, active):
> page = table_0(request.args(0)) or redirect(URL(index_link))
> results = db((field == page.id) & (active == True)).select(orderby = ~
> table_1.id,
> cache =
> (cache.ram,
>
> 10))
> return dict(page = page, results = results)
>
> i think the error is on target load, so that my page keep showing
> loading...
>
> did you have any way out for this probelm?
> thank you so much.
>
> On Sat, Jun 11, 2011 at 11:05 AM, Anthony <[email protected]> wrote:
>
>> Do you have a blog_comment_show() action in your controller?
>>
>> On Friday, June 10, 2011 10:58:56 PM UTC-4, 黄祥 wrote:
>>
>>> thank you so much for your hints, anthony, but, pardon me, the results
>>> on the form components is loading..., the page didn't show an error, but
>>> keep loading..., is there something i missed in my code?
>>>
>>> e.g.
>>> *=== controller ===*
>>>
>>> blog = db.blog
>>> blog_comment = db.blog_comment
>>> blog_comment_blog_id = db.blog_comment.blog_id
>>> blog_comment_active = db.blog_comment.is_active
>>>
>>> def blog_comment_add():
>>> return __add_2(blog, blog_index, blog_comment, blog_comment_blog_id)
>>>
>>> @auth.requires_login()
>>> def __add_2(table_0, index_link, table_1, field):
>>> page = table_0(request.args(0)) or redirect(URL(index_link))
>>> field.default = page.id
>>> form = crud.create(table_1, message = T('Record Inserted'),
>>> next = URL(args = page.id))
>>> *response.js = 'web2py_component(action = "%s", target = "%s")' *
>>> * % (URL('blog_comment_show.load'), *
>>> * 'comments_%s hidden' % page.id)*
>>> return dict(page = page, form = form)
>>>
>>> *=== view ===*
>>>
>>> {{=LOAD('default', 'blog_comment_show.load', args = page.id, ajax =
>>> True)}}
>>> *{{=LOAD('default', 'blog_comment_add.load', args = page.id, *
>>> * target = 'comments_%s hidden' % page.id, ajax = True)}}*
>>>
>>> *=== blog_comment_show.load ===*
>>>
>>> {{if len(results):}}
>>> <span onclick = "jQuery('.comments_{{=page.id
>>> }}').slideToggle('slow');">
>>> {{=A(T('Comments (%s)' % len(results)), _href = '#')}}
>>> </span>
>>>
>>> <div class = "comments_{{=page.id}} hidden">
>>> {{for blog_comment in results:}}
>>> {{=SPAN(db.auth_user[blog_comment.created_by].first_name, T(' on
>>> '),
>>> blog_comment.created_on, T(' Said '),
>>> blog_comment.comment)}}
>>> {{=BR()}}
>>> {{=SPAN(blog_comment.like,
>>> _id = 'blog_comment_like_%s' % blog_comment.id)}}
>>> {{=SPAN(T('People Like This'))}}
>>>
>>> <span onclick="jQuery('#id').val('{{=blog_comment.id}}');
>>> ajax('{{=URL('blog_comment_like.load')}}', ['id'],
>>> 'blog_comment_like_{{=blog_comment.id}}');">
>>> {{=A(T('Like'), _href = '#')}}
>>> </span>
>>> {{=BR()}}
>>> {{pass}}
>>> </div>
>>> {{else:}}
>>> {{=DIV(B(T('No Comment Posted Yet')))}}
>>> {{pass}}
>>>
>>> *=== blog_comment_add.load ===*
>>>
>>> {{=DIV(A(T('Post a Comment'), _href = '#'), _class = 'post',
>>> _onclick = "jQuery('.form_%s').slideToggle('slow');" % page.id)}}
>>>
>>> {{=DIV(form, _class = 'form_%s hidden' % page.id,
>>> _onsubmit = "ajax('blog_comment_add', [], 'comments_%s hidden');"
>>> % page.id)}}
>>>
>>> On Sat, Jun 11, 2011 at 8:28 AM, Anthony <[email protected]> wrote:
>>>
>>>> Maybe try having the post comment action return some JS via response.js
>>>> that calls the web2py_component JS function to update the list component:
>>>>
>>>> def post_comment():
>>>> # do some stuff
>>>> response.js='web2py_component(action="%s",target="%s")' %
>>>> (URL('list_comments.load'), 'comment_list')
>>>> return dict(...)
>>>>
>>>> def list_comments():
>>>> # code to list comments
>>>>
>>>> In view:
>>>>
>>>> {{=LOAD('post_comment.load', ajax=True)}}
>>>> {{=LOAD('list_comments.load', target='comment_list', ajax=True)}}
>>>>
>>>>
>>>> See
>>>> http://web2py.com/book/default/chapter/13#Client-Server-Component-Communications
>>>> .
>>>>
>>>> Anthony
>>>>
>>>> On Friday, June 10, 2011 8:44:26 PM UTC-4, 黄祥 wrote:
>>>>
>>>>> hi,
>>>>>
>>>>> is ajax can work in components? i mean let say that i separated the
>>>>> comment into 2 components, 1 for list of view comments and the other
>>>>> is form to post the comment. i have a problem when i post the comment
>>>>> using the form, the data that have been posted is not directly change
>>>>> on list of comments (the other components), i must refresh my browser
>>>>> many times so that the list comments can show the latest posted
>>>>> comment. is there any clue or solution to implement ajax that works in
>>>>> other components?
>>>>>
>>>>> any hints, suggestion is greatly appreciate.
>>>>> thank you very much.
>>>>
>>>>
>>>
>