2017-12-21 16 views
0

私はカスタムディレクティブを作成しました。私は単純な変数バインディングを実行したいと思います。データを直接設定すると、すべてが正しく表示されますが、クエリを使用してもデータは設定されていません。コンソール出力から、変数が割り当てられたことがわかります。変数のバインドが動作しない

これは私のディレクティブです:

function tutorialCourse(){ 
return{ 
    restrict: 'E', 
    templateUrl: 'app/tutorial/tutorialCourse.html', 
    controller: 'TutorialCourseController', 
    controllerAs: 'tutorial' 
}; 
}; 

、これは私のコントローラです:

TutorialCourseController.$inject = ['$q', 'Course']; 

function TutorialCourseController($q, Course){ 

    this.course = {}; 

    loadTutorial(); 

    function loadTutorial(){ 
     Course.query().$promise.then(function(courses){ 
      this.course = _.first(courses); 
      console.log(this.course) 

     }); 
    }; 

} 

私のHTMLは本当に簡単です:

<div class="panel panel-primary"> 
    <div class="panel-heading"> 
     <h4 class="panel-title">{{tutorial.course.title}} </h4> 
    </div> 
</div> 

私はすでに内の値を返すようにしようとしましたlaodTutorialを呼び出し、関数呼び出しを使用してコース変数に直接割り当てますが、それは機能しませんでした。しかし、私がこれをすれば、

this.course = {id: 11, title: "Tutorial"} 

すべてがうまくいきます。私が理解していない、または間違っていることは何ですか?

答えて

2

問題はthis.courseです。クエリコールバック関数内での使用は、関数外のthis(コンテキスト)ではありません。なぜなら各javascript関数はインスタンス化/実行されたときに独自のコンテキストを持っているからです。

あなたはvar self = this;のコントローラコンテキストを格納することによってこの問題を解決し、TutorialCourseControllerコンテキストを指しながらselfを使用することができます。レキシカルスコープでは、JavaScriptはselfという変数の値を解決します。

TutorialCourseController.$inject = ['$q', 'Course']; 

function TutorialCourseController($q, Course){ 
    var self = this; 
    self.course = {}; 

    loadTutorial(); 

    function loadTutorial(){ 
     Course.query().$promise.then(function(courses){ 
      self.course = _.first(courses); 
      console.log(this.course); 
     }); 
    }; 
} 

John Papa styleguide

+0

ニースが、なぜ結果の仕事を返さなかったへの参照?同様に this.course = loadTutorial(); とloadTutorial中:あなたは 'loadTutorial'機能からの約束を返す場合にのみ動作しますx3lq @(コース) – x3lq

+0

_.first リターン。そして、 'query'関数が解決されたときにそれを解決することを忘れないでください。しかし、それは 'ngResourece'が応答オブジェクトをunwrapするので、Promiseオブジェクトになります。 –

+0

大丈夫です。それを見なければならない;私はこれに新しいです。 – x3lq

関連する問題