0

return関数には非常に単純なロジックがありますが、期待どおりに機能しません。もちろん、コードを少し長くして問題を解決することもできますが、できるだけ小さくしたいと思います。

これが私のコードです:

#Return title if exists or false otherwise
getPageTitleFromMainContent = (mainContent) ->
  mainContent.find('#pageTitle') ?.length ?=  false

if y = (getPageTitleFromMainContent $("#mainContent"))
  y.css color:red

ご覧のとおり、#mainContentで#pageTitleが見つかった場合は、赤になっているはずです。ただし、関数が見つかった場合は#pageTitleを返さず、.lengthを返します。

js2coffee.orgから、コードが次のようにコンパイルされていることがわかります。

var getPageTitleFromMainContent, y;

getPageTitleFromMainContent = function(mainContent) {
  var _ref, _ref1;
  return (_ref = mainContent.find('#pageTitle')) != null ? (_ref1 = _ref.length) != null ? **_ref1 : _ref.length = false : void 0;**
};

if (y = getPageTitleFromMainContent($("#mainContent"))) {
  y.css({
    color: red
  });
}

そして、それは_ref : _ref.length = false : void 0;、ではなく、である必要があり_ref**1** : _ref.length = false : void 0;ます。

http://jsfiddle.net/X8VjJ/1/

ありがとうございました!

4

2 に答える 2

3

が見つかった場合は、#pageTitle赤く#mainContentする必要があります

これは、はるかに簡単な方法で実現できます。

 $('#mainContent #pageTitle').css(color: 'red')

で見つからない場合、要素の空のセットの css を変更しようとするため、ノーオペレーションです。#pageTitle#mainContent

あなたが提示したコードは、実際には意味がありません。jQueryセレクターが返らないか、一致しない場合?.は不要です。空の要素セットを返します。したがって、常に が返されます。これは常に数値であり、またはを返すことに依存するため、割り当ては実行されません。おそらく要素の長さを に設定したくないので、これは良いことです。nullundefinedlengthlengthnullundefinedfalse

最後に、これは 3 項の if ステートメントではありません。CoffeeScript の 3 項 if ステートメントは次のようになりますif foo then bar else baz

于 2013-02-21T15:24:48.740 に答える
2

そのコードが理にかなっているかわからない。長さが定義されていない限り、長さプロパティに TO を効果的に割り当てようとしています。定義されている場合は、単純に length プロパティを返します。コードと動作は正しいように見えますが、存在演算子と戻り値の理解が間違っています。見つかった要素を返したい場合は、おそらく長さチェックから切り離す必要があります。

たぶん次のようなもの:

getPageTitleFromMainContent = (mainContent) ->
  arr = mainContent.find('#pageTitle')
  if arr.length then arr else false

Ian がより洗練された回答で説明したように、arr で存在演算子を使用する必要はありません (jquery を想定)。これは、常に要素の配列 (見つからない場合は長さゼロ) になるためです。

于 2013-02-21T15:18:05.577 に答える