2010-11-12 3 views
0

Я пытаюсь выполнить в observe_field в рельсах 3.observe_field в Rails 3

В рельсах 2.3.5 у меня есть: -

<%= observe_field 'query', :frequency => 2, 
          :update => "search_results",         
          :url => {:controller => params[:area], :action => "search",:area => params[:area]}, 
          :method=>:get, 
          :with => "query" %> 

Который работает нормально, проверяя мой text_field_tag ​​"запрос" и обновление мои «search_results» каждые две секунды. Это то, что я пытаюсь имитировать с использованием прототипа.

На данный момент у меня в базовой заявке в Rails 3: -

<script> 
document.observe("dom:loaded", function() { 
$('search').observe('change', 
respondToChange()); 
}); 
</script> 

или

<script> 
document.observe("dom:loaded", function() { 
new Form.Element.Observer(
'search', 
1, 
respondToChange() 
) }); 
</script> 

Оба из которых вызывает функцию respondToChange при загрузке страницы, несмотря на «йот: загружен ", а затем больше не наблюдает.

Есть ли у кого-нибудь представление о том, как я могу получить повторные проверки наблюдателя в моем «поиске» text_field_tag.

+2

Человек, я предлагаю вам работать немного больше на форматированием вопрос, это своего рода грязный. –

+0

Спасибо, я просто не знаю, как это сделать, и я надеюсь, что я его правильно отредактировал – MDM

ответ

0

С благодарностью «themiddleman» и «agnaki» где-то там, в эфире, я решил эту проблему:

Использование respondToChange, не respondToChange()

В скобках() выполнить функцию, в то время как без() он ссылается на него.

$('search').observe('change', respondToChange); 
// only triggers when the focus is moved away from the text_field. 

new Form.Element.Observer(
    'search', 
    1, 
respondToChange 
) }); 

//................................repeatedly checks the text_field,every 1 second, and call the function if there is a any change. 
+0

Я его взломал. $ ('Поиск'). Вверх ('форма'). Представить() – MDM

0

Вот мой полный код, если кому-то интересно. Этот код наблюдает за «поиском» text_field_tag ​​каждые 2 секунды, и если есть изменение в значении, он автоматически запускает поиск. Думаю, теперь кнопка отправки может быть удалена. Я могу добавить :autocomplete => "off", :onKeyPress=>"return disableEnterKey(event)") %> в text_field_tag, чтобы отключить ключ возврата, но не уверен.

В моей index.html.erb у меня есть:

<h1>Listing homepages</h1> 
<div id = "testsearch"> 
    <%=render :partial => 'homepage'%>  
</div> 
<%= form_tag homepages_path, :method => 'get', :remote => true do %> 
<%= label_tag(:search, "Search for:") %> 
<%= text_field_tag :search, params[:search]%> 
<%= submit_tag "search", :name => nil %> 
<%end%> 

<%= set_focus_to_id 'search' %>    // I have a helper "set_focus_to_id" 

<script> 
document.observe("dom:loaded", function() { // ensures the page is loaded first 
new Form.Element.Observer(     // Observes the text_field_tag every 2 seconds 
    'search', 
    2, 
    respondToChange       //refrences the function in the Layout <head> 
)           // on a change in search calls respondToChange 
}); 
</script> 
<br /> 
<%= link_to 'New Homepage', new_homepage_path %> 

В моей голове макета приложения у меня есть:

<script> 
function respondToChange() { 
$('search').up('form').submit()   // The ".up finds the form in the DOM" 
}; 
</script 

В моем контроллере # индекс у меня есть:

def index 
    @homepages = Homepage.search(params[:search]) //".search method is in the Model" 
    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @homepages } 
    format.js 
end 
end 

В моей модели у меня есть:

def self.search(search_item) 
    if search_item 
    self.where('section LIKE ?', "%#{search_item}%") //Handles the ajax call. 
    else 
    self.all           //Handles the html call on startup. 
    end 
end 

В помощнике у меня есть:

def set_focus_to_id(id) 
    javascript_tag("$('#{id}').focus()"); 
end 

В "_homepage" частичная у меня есть:

<table> 
    <tr> 
    <th>Id</th> 
    <th>Section</th> 
    <th>Link</th> 
    <th>Description</th> 
    <th></th> 
    <th></th> 
    <th></th> 
</tr> 

<% for homepage in @homepages %> 

    <tr> 
    <td><%= homepage.id %></td> 
    <td><%= homepage.section %></td> 
    <td><%= homepage.link %></td> 
    <td><%= homepage.description %></td> 
    <td><%= link_to 'Show', homepage %></td> 
    <td><%= link_to 'Edit', edit_homepage_path(homepage) %></td> 
    <td><%= link_to 'Destroy', homepage, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<%end%> 

</table> 

И в index.js.erb у меня есть:

$('testsearch').update("<%= escape_javascript(render :partial => 'homepage') %>"); 

Если у кого есть какие-либо комментарии о том, как я могу это улучшить, свяжитесь со мной или скажите.

0

Я думаю, что теперь я решил проблему выполнения вызова ajax через программирование.Мне нужно будет проверить это во всех типах браузеров, но на данный момент он работает в Firefox и Safari. Теперь я переместил и javascript «document.observe» («dom: loaded») и функцию, которую он называет «responseToChange()» в голову приложения с content_for. Все остальные файлы остаются неизменными.

В моем index.html .erb теперь у меня есть: -

<h1>Listing homepages</h1> 
<div id = "testsearch"> 
    <%=render :partial => 'homepage'%>  
</div> 
<%= form_tag homepages_path, :method => 'get', :remote => true do %> 
    <%= label_tag(:search, "Search for:") %> 
<%= text_field_tag :search, params[:search]%> 
<%= submit_tag "search", :name => nil %> 
<%end%> 

<%= set_focus_to_id 'search' %>    

<% content_for :search_javascript do %> 

function respondToChange() { 

    var pars = 'search=' + $('search').getValue() 

     new Ajax.Request("<%= homepages_path %>" ,{ 
     method: 'get', 
     parameters: pars 
    }); 
}; 

document.observe("dom:loaded", function() { 
    new Form.Element.Observer(    
     'search', 
     2, 
     respondToChange 

    )           
}); 

<% end %> 

<br /> 
<%= link_to 'New Homepage', new_homepage_path %> 

В моем файле макета приложения теперь у меня есть: - GardenR3 <% = stylesheet_link_tag: все%> <% = javascript_include_tag: по умолчанию%> <% = csrf_meta_tag%>

<script> 
<%= yield :search_javascript %> 
</script> 

</head> 
<body> 

<%= yield %> 

</body> 
</html>