この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

コンポーネントの有効性の確認

非同期コードの実行中に UI で他の場所に移動すると、フレームワークは、非同期要求を実行したコンポーネントを非表示にして破棄します。そのコンポーネントを引き続き参照できますが、コンポーネントは無効になっています。cmp.isValid() コールは、無効なコンポーネントでは false を返します。

無効なコンポーネントに対して cmp.get() をコールすると、cmp.get()null を返します。

無効なコンポーネントに対して cmp.set() をコールしても、何も起こらず、エラーも発生しません。これは基本的に無演算 (no op) 関数です。

多くのシナリオで cmp.isValid() コールは不要です。cmp.get() から取得した値の null チェックで十分です。cmp.isValid() をコールする主な理由は、コンポーネントに対して複数のコールを実行する場合に、結果ごとに null チェックを実行しなくて済むこと��す。

フレームワークのライフサイクルの内部

クライアント側コントローラに関連付けられたコンポーネントを参照する場合、クライアント側コントローラのコールバックで cmp.isValid() チェックは必要ありません。コンポーネントが無効であることがフレームワークによって自動的にチェックされます。同様に、イベント処理時や、フレームワークのライフサイクルフック (init イベントなど) 内で cmp.isValid() チェックは必要ありません。

クライアント側コントローラのサンプルを見てみましょう。

1({
2    "doSomething" : function(cmp) {
3        var action = cmp.get("c.serverEcho");
4        action.setCallback(this, function(response) {
5            var state = response.getState();
6            if (state === "SUCCESS") {
7                if (cmp.get("v.displayResult)) {
8                    alert("From server: " + response.getReturnValue());
9                }
10            }
11            // other state handling omitted for brevity
12        });
13
14        $A.enqueueAction(action);
15    }
16})

クライアント側コントローラに結び付けられているコンポーネントは、cmp パラメータとして doSomething アクションに渡されます。cmp.get("v.displayResult) がコールされたときに cmp.isValid() チェックは必要ありません。

ただし、自分のコンポーネントが有効であるにもかかわらず、有効でない可能性のある別のコンポーネントへの参照を保持している場合は、他のコンポーネントの cmp.isValid() チェックが必要になることがあります。ローカル ID が child の別のコンポーネントへの参照を持つコンポーネントの例を見てみましょう。

1({
2    "doSomething" : function(cmp) {
3        var action = cmp.get("c.serverEcho");
4        var child = cmp.find("child");
5        action.setCallback(this, function(response) {
6            var state = response.getState();
7            if (state === "SUCCESS") {
8                if (child.get("v.displayResult)) {
9                    alert("From server: " + response.getReturnValue());
10                }
11            }
12            // other state handling omitted for brevity
13        });
14
15        $A.enqueueAction(action);
16    }
17})

子コンポーネントがない前の例の次の行を、

1if (cmp.get("v.displayResult)) {

次のように変更します。

1if (child.get("v.displayResult)) {

子コンポーネントが無効な場合 child.get("v.displayResult)null を返すため、ここでは child.isValid() コールは不要です。子コンポーネントに対して複数のコールを実行し、結果ごとに null チェックを実行するのを回避する場合にのみ、child.isValid() チェックを追加します。

フレームワークのライフサイクルの外部

setTimeout()setInterval() などの非同期コードでコンポーネントを参照する場合、または Promise を使用する場合、cmp.isValid() コールは非同期要求の結果を処理する前にコンポーネントがまだ有効であることをチェックします。多くのシナリオで cmp.isValid() コールは不要です。cmp.get() から取得した値の null チェックで十分です。cmp.isValid() をコールする主な理由は、コンポーネントに対して複数のコールを実行する場合に、結果ごとに null チェックを実行しなくて済むことです。

たとえば、コンポーネントが無効な場合、cmp.set() コールは何もしないため、この setTimeout() コール内で cmp.isValid() チェックは必要ありません。

1window.setTimeout(
2    $A.getCallback(function() {
3        cmp.set("v.visible", true);
4    }), 5000
5);