2017-01-20 6 views
2

コントローラコードで使用できる角度1.6のコンポーネントにいくつかの値をバインドしようとしています。なぜバインディング値はすぐにコントローラで使用できないのですか

私は誤解する必要がありますが、コントローラーを実行するときに変数を使用することはできません。私がそれを管理した唯一の方法は、次のダイジェストサイクルにコードをプッシュするために$タイムアウトを入れることです。

私はここで間違っていますか?

関連するセクションはここにある:

var SelectorCtrl = ['$scope', '$http', '$timeout', 
    function ($scope, $http, $timeout) { 
    var self = this; 
    alert("1: " + self.hierarchyId); 

    // I'm not 100% sure why this has to be in the next digest cycle 
    $timeout(function(){ 
     $scope.categories = self.categories; 
     alert("2: " + self.hierarchyId); 

    }); 
} 

app.component('categorySelector', { 
    templateUrl: 'categorySelector.html', 
    controller: SelectorCtrl, 
    bindings: { 
    hierarchyId: "@", 
    disabled: "=", 
    categories: "=", 
    onSelectionChanged: "&" 
    } 
}); 

参照くださいplunker:https://plnkr.co/edit/8rtDuCawdHaiXzQU5VBR

+0

なぜあなたは '同じコンポーネント内の$ scope'と' this'を混合していますか? – Claies

答えて

4

これはあなたが上のconfigサイクルでそれを設定することができ、なぜなら角1.6で導入された$compileProvider.preAssignBindingsEnabled(flag)である$compileProvider

無効にした場合(false)、コンパイラは バインディングを割り当てる前にコンストラクタを最初に呼び出します。

デフォルト値はAngular 1.5.xではtrueですが、 Angular 1.6.xではfalseに切り替わります。

$onInitすべてのバインディングが使用可能になる角度コンポーネントのライフサイクルイベント内に、すべてのバインディングが取得されます(バインディングが同期的に渡された場合)。

self.$onInit = function() { 
    $scope.categories = self.categories; 
    alert("2: " + self.hierarchyId); 
}; 

注:それはthis$scopeを混合する悪い習慣です。むしろ$scopeを使用して、コード角2のマイグレーションプルーフを作成することは避けてください。


あなたはコントローラ機能をインスタンス化利用できるように結合後、あなたは$compileProvider.preAssignBindingsEnabled(true)を設定することができますしたい場合。どちらがself.categories(バインディング)の値になりますか。

app.config(function($compileProvider){ 
    $compileProvider.preAssignBindingsEnabled(true) 
}); 

Similar answer

+0

ありがとう、 '$ onInit'には心配はありません。ここには表示されていませんが、私はDevextreme UIライブラリ(角度1の統合)を使用しています。このライブラリは値のスコープを調べているので、スコープ変数の名前であるコンポーネントに文字列を渡す必要があります。したがって、値をスコープに設定する必要があります。乾杯。 –

+0

@RichardGあなたは '$ scope'を全く使う必要はありません、' $ ctrl.categories'のようなdevexpressコントロールへのバインディングを渡すことができます(スコープ変数にのみ内部的に存在します)。私は 'devexpress'と' controllerAs'パターンを使用しています。それはうまく動作します:) –

+0

私はそれを試してみましょう。情報をありがとう –

関連する問題