0

は、だから私は、分離株の範囲controllerAsパターンとディレクティブを持っています。バインディングない時々

var directive = { 
     restrict: 'E', 
     scope: { 
      something: '=' 
     }, 
     templateUrl: './App/directiveTemplate.html', 
     controller: directiveController, 
     controllerAs: 'vm', 
     bindToController: true 
    } 

と私は約束を返し$ HTTPを使用してRESTサービスへの呼び出しでのinitコントローラインチ

function directiveController(someService) { 

    var vm = this; 

    // Here vm.something is defined and bound to the appropriate model set where the directive is used 

    init() 

    function init() { 
     return someService.getProducts() 
     .then(productsReady); 

     function productsReady(response) { 
      vm.products = response; 
      //find product using vm.something 

      // here vm.something is undefined 

      return vm.products; 
     } 
    } 

問題は、私はinit()方法vm.something前にブレークポイントを設定ならば、それがあるべきように定義されているがproductsReady機能で、それが定義されていないされていることです。

これは正常な動作ですか?約束はコードを別の範囲で解決していますか?

+1

'productsReady()'関数は 'のinit()'メソッド内で定義されています。そのスコープのローカルです。なぜそれが 'init()'の外で定義されると思いますか? –

+0

javascript変数の範囲を理解しようとしていますか?それとも、あなたがしようとしていることが働いていないのですか? –

+0

@JCFord私はJavascriptの専門家ではありません。 initメソッドはスコープにアクセスできるので、init内で定義されたメソッドは継承の方法でアクセスすることも想定していました。本当ではないと思いますか? –

答えて

1

は、バインディングのタイミングを保証するために$onInit Life-Cycle Hookを使用します。

function directiveController(someService) { 

    var vm = this; 

    ̶i̶n̶i̶t̶(̶)̶ 

    this.$onInit = init; 

    function init() { 
     return someService.getProducts() 
     .then(productsReady); 

     function productsReady(data) { 
      vm.products = data; 

      return vm.products; 
     } 
    } 

ドキュメントから:存在しているバインディングに依存している

初期化ロジックがあり、コントローラの$onInit()方法で配置する必要がありますの後に常にと呼ばれることが保証されています。

.component('myComponent', { 
    bindings: {value: '<'}, 
    controller: function() { 
    this.$onInit = function() { 
     // `this.value` will always be initialized, 
     // regardless of the value of `preAssignBindingsEnabled`. 
     this.doubleValue = this.value * 2; 
    }; 
    } 
}) 

— AngularJS Developer Guide - Migrating to V1.6 - $compile

+0

これを見ていきますが、バインディングは実際に解決されていると思いますが、何らかの理由で未定義になってしまいます。しかし、これはとにかく良いアイデアであり、おそらく私はそれをやっているべきです。 –

+0

これは、タイトルに記載された問題を抱えている他のユーザーのための正式な答えです。書かれたあなたの質問は、問題を再現するのに十分な情報を提供しません。 – georgeawg

+0

本当に、私の問題はどこかのバインディングの反対側にある必要があります。私は作業しているコードを書かなかったので、一見する必要があります。しかしおそらく、これは後のブラウザの答えとしてマークする必要があります。 –