0

これは非常に単純かもしれませんが、私の問題を解決する方法を説明する適切なドキュメントが見つかりません。

  <tr ng-repeat="thing in things">
        <td>{{ thing.name }}</td>
        <td>{{ thing.category }}</td>
        <td>{{ thing.content }}</td>
        <td>{{ thing.confirms }}</td>
        <td>{{ thing.declines }}</td>
        <td> <button ng-click="doSomething('{{ thing }}')">Do what we want</button></td>
    </tr>

現在、すべてが正常に機能し、期待されています。私が作成したサービス内のdoSomething関数では、エラーを回避するために文字列にキャストした引数として「物」オブジェクトを渡したいと考えています (後で変換します)。そのオブジェクトをサービスに出力すると、オブジェクトのコンテンツは返されません (ただし、レンダリングされた HTML には表示されます)。私のサービスに渡されるのは、文字列「{{ thing }}」であり、オブジェクトの値ではありません (したがって、私の JSON.parse は失敗します)。これは、Chrome 開発ツールからレンダリングされた HTML です。

doSomething('{"name":"Debbie Harry","id":"526f9eb7e4b0b5062e14c1dc","category":"Basic Info","content":"Debbie Harry is cool","confirms":5,"declines":0}')

どうすればこれを克服できますか?AngularJS の中かっこ宣言ではなく、JSON オブジェクトが渡されていることを確認するにはどうすればよいですか?

私が自分自身をうまく説明していない場合は、そのように述べてください。私の問題を言い直します.

4

2 に答える 2

4

このようにしてください

<td> <button ng-click="doSomething(thing)">Do what we want</button></td>

または、できるかもしれません(ただし、これはしないでください)

<td> <button ng-click="doSomething(" + {{thing}} + ")">Do what we want</button></td>

thingngClick ディレクティブは値を読み取り、JavaScript として解析するため、変数をそのまま使用できます。thing変数はブロック内でアクセスできますng-repeat

angularjs ソースを掘り下げると、このコードが見つかります。ngClickこれは、ディレクティブがどのように機能するかを理解するのに役立ちます。

var ngEventDirectives = {};
forEach(
'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress'.split(' '),
function(name) {
  var directiveName = directiveNormalize('ng-' + name);
  ngEventDirectives[directiveName] = ['$parse', function($parse) {
    return function(scope, element, attr) {
      var fn = $parse(attr[directiveName]);
      element.bind(lowercase(name), function(event) {
        scope.$apply(function() {
          fn(scope, {$event:event});
        });
      });
    };
  }];
}
);
于 2013-11-14T11:43:20.847 に答える
1

Sangdol が正解を出しましたが、裏で何が起こっているのかを少し説明したいと思います。

ngClickディレクティブは内部的$parseに service を使用して式を評価doSomething('{{ thing }}')し、 current でそれを呼び出します$scope。したがって、基本的に angular は現在の (または親) スコープで doSomething 関数を探し'{{ thing }}'、文字列である引数で実行します。ご覧のとおり、thingこのコンテキストでは変数ではなく、JS コードのように文字列の一部です。引用符を削除すると、スコープ$parseだけでなくプロパティも表示されます。私が説明しているのは角度式であり、基本的には JavaScript のサブセットです。たとえば、スコープ ( ) に参照を指定すると、次のように記述できます。doSomethingthingalert$scope.alert = window.alert

<button ng-click="alert(2+2)">button</button>

angular は警告ダイアログを呼び出すだけでなく、2+2 から 4 も評価します。

于 2013-11-14T11:54:54.670 に答える