2017-01-09 56 views
0

我可能會錯過一些東西很明顯這裏,提前道歉,如果這樣......使用jQuery單擊功能,在某些地方執行代碼,而不是在別人

使用Ajax-的Solr和實現我自己的用戶當前的搜索版本小部件示例/教程 - https://github.com/evolvingweb/ajax-solr/wiki/Reuters-tutorial%3A-step-5我有一段代碼,看起來像這樣:

(function($) { 
    AjaxSolr.CurrentSearchWidget = AjaxSolr.AbstractWidget.extend({ 
     start: 0, 

     afterRequest: function() { 
     var self = this; 
     var links = []; 

     var q = self.manager.store.get('q').val(); 
     var qText = q; 
     if (q != null && q != '*:*') { 
      if (q.split(':').length == 2) { 
       qText = q.split(':')[1]; 
      } 
      links.push($('<a href="#" class="cur-search"></a>') 
         .text('search: ' + qText + ' (remove)').click(function() { 
       localStorage.removeItem("query"); 
       localStorage.setItem("query", "*"); 
       self.manager.store.get('q').val('*:*'); 
       self.doRequest(); 
       return false; 
      })); 
     } 

     var fq = self.manager.store.values('fq'); 
     var prettyText = ""; 
     for (var i = 0, l = fq.length; i < l; i++) { 
       //string manipulation for user-facing text 
       links.push($('<a href="#" class="cur-search"></a>') 
         .text(prettyText + ' (remove)').click(self.removeFacet(fq[i]))); 

      //local storage stuff 
      } 
      if (links.length > 1) { 
       links.unshift($('<a href="#" class="cur-search"></a>') 
          .text('remove all').click(function() { 
       localStorage.clear(); 
       localStorage.setItem("query", "*"); 
       self.manager.store.get('q').val('*'); 
       self.manager.store.remove('fq'); 
       self.doRequest(); 
       return false; 
       })); 
      } 

      //update DOM 
     }, 

我已經剝離出來的不必要的代碼,但上述工作正常。然而,如果我改變

links.push($('<a href="#" class="cur-search"></a>') 
          .text(prettyText + ' (remove)') 
          .click(self.removeFacet(fq[i]))); 

使用函數按照上面的實施例和下面,像

links.push($('<a href="#" class="cur-search"></a>') 
          .text(prettyText + ' (remove)') 
          .click(function() { 
    self.removeFacet(fq[i]); 
})); 

,這樣我可以添加有額外的代碼,它不再運行removeFacet錨時被點擊。感謝您對我失蹤的任何幫助!

回答

1

這似乎是功能範圍的問題。這不再指向你的對象。我會建議像這樣綁定你的「自我」對象。

links.push($('<a href="#" class="cur-search"></a>') 
     .text(prettyText + ' (remove)') 
     .click(function() { 
      var self = this; 
      self.removeFacet(fq[i]); 
     }).bind(self)); 
+0

一個範圍問題非常有意義,但不幸的是我似乎無法讓您的更改工作,我只是不斷收到一個jQuery「TypeError:m.push不是一個函數」,我似乎無法修復 –

0

,請查看是否切換到這個工程

links.push($('<a href="#" class="cur-search"></a>') 
          .text(prettyText + ' (remove)') 
          .on('click', function() { 
    self.removeFacet(fq[i]); 
})); 
+0

不幸的是,正如其他人所說,它看起來像一個範圍問題。 –

0

你遇到了問題 - 你有沒有被立即執行內部函數(匿名點擊功能),因此迭代器被「丟失」 。以下面的例子

var i, colors = ['green', 'blue', 'red']; 

for (i = 0; i < colors.length; i++) { 
    var color = colors[i]; 
    setTimeout(function() { 
     console.log(color); 
    }, i * 1000); 
} 
// red, red, red 

將登錄3次紅色,因爲函數(這裏的超時內)的代碼是外循環執行時,所述迭代器在其最後的位置。

使用該方案中值將在每次迭代被捕獲到一個參數傳遞給一個函數,該函數創建一個範圍,這將產生 輸出綠色,藍色和紅色

var i, colors = ['green', 'blue', 'red']; 

for (i = 0; i < colors.length; i++) { 
    (function(color) { 
     setTimeout(function() { 
      console.log(color); 
     }, i * 1000); 
    })(colors[i]); 
} 
// green, blue, red 

你的情況這樣的事情應該工作:

links.push($('<a href="#" class="cur-search"></a>') 
.text(prettyText + ' (remove)') 
.click((function(instance, facet) { 
    // your code here 
    // and delete 
    instance.removeFacet(facet); 
})(self, fq[i])); 
+0

範圍問題是有道理的,但我已經嘗試過您的更改,並且removeFacet仍然不是不幸的。 –

+0

@KirstyB。你能否確認它沒有被調用,或者是否調用了不正確的元素?你有任何js錯誤? –

+0

它根本沒有被調用,並且沒有控制檯錯誤 –

0

它總是最好的功能使用。嘗試這樣的事情......

$(window, "a.cur-search", function() { 
     var self = this; 
     self.removeFacet(fq[i]); 
    }); 

你可能需要把FQ [i]於數據或東西,使其可用。

相關問題