2016-10-10 3 views
0

私は、Angularを使用して動的に読み込まれたページを持っています。本質的に、Angularは、コントローラのデータを取得して属性を取り込むために、バックエンドに対して$http.get要求を行います。AngularとJQueryの実行時間

たとえば、私は$http.get('/_car_data')を呼び出し、返されたJSONはDealershipDealership.carsというコントローラに保存されます。

Angularを使用して、すべてDealership.carsを入力ボックスとしてHTMLページに出力します。

私の問題は、各入力にjquery 'autocomplete'を追加したいということです。これは、ページと角度が完全にレンダリングされた後、Googleデベロッパーコンソールで操作すると美しく機能します。ただし、スクリプトがHTMLにリンクされた後、およびHTMLの本文の後にこの機能を両方含めると、機能しません。このオートコンプリート機能を$(document).readyで囲んでも機能しません。

これは、Google開発者向けコンソールで実行すると完全に機能しますが、外部リンクされたjsとhtmlボディの後には含まれません。

$(document).ready(function() { 

     var availableTags = []; 

     $.ajax({ 
       url: '_available_cars', 
       data: {}, 
       method: 'GET', 
       dataType: 'json', 
       success: function(data) { 
        availableCars = data['cars']; 

        $(".carchoice").autocomplete({ 
         source: availableCars 
        }); 
       }, 
       error: function(jqXHR, textStatus, errorThrown, data) { 
        console.log(textStatus, errorThrown); 
       } 
     }); 
}); 

だから私の質問は、どのように私はすべてのhtmlまで待たないとアンギュラ作成され、動的にロードされたコンテンツは、私のjqueryの文を実行するためにレンダリング終了しますか?

+0

anglejsの方法で行う必要があります。つまり、指示に従います。 –

+0

質問と思考が間違っています。ディレクティブでプラグインを呼び出す必要があります。要素が存在することが保証されています – charlietfl

答えて

0

linkファンクションAgular docsを使用してください。この関数は、コンポーネントのhtmlテンプレートがコンパイルされ、要素が実際のDOMにまだリンクされていない場合にトリガーされます。したがって、jQueryオートコンプリートでこの要素を操作しようとすることができます。

0

jQueryがangularjsとcomunicateする最良のユニークな方法は、ディレクティブによるものです。どんな種類のショートカットやハックも避けることをお勧めします。ちょっとしたコードで本当の混乱に変わります。

ここでは、あなたの問題をどのように解決できるかを示します。

angular.module('myApp', []); 

angular.module('myApp').factory('CarService', function ($http, $q) { 
    var cars = []; 

    return { 
     getAvailableCars: function() { 
      if(cars) return $q.resolve(cars); 

      return $http.get('_available_cars').then(function (response) { 

       cars = response.data; 

       return cars; 
      }); 
     } 
    }; 
}); 

angular.module('myApp').directive('carchoice', function(CarService) { 
    return { 
     restrict: 'C', 
     link: function(scope, element, attrs) { 

      CarService 
       .getAvailableCars() 
       .then(function (availableCars) { 

        $(element).autocomplete({ 
         source: availableCars 
        }); 
      }); 
     } 
    }; 
}); 
+0

大したことではありませんが、jQuery.jsがangular.jsより前のページに含まれている場合、 'element'はすでにjQueryです – charlietfl

+0

jqueryの関数で' element'をラップする理由は、コード内で何が起こっているのかを明確にします。要素はすでにjQueryでラップすることができますが、問題は発生しません。原因はjQueryが内部で処理するためです。しかし、いつも私たちが気付かないという良い事実を指摘してくれてありがとう。 –

+0

問題はありません。また、angular.jsより前には問題がない人もいます。これは '$(selector)'と同じですが、これは動作します。しかし、正しく設定されていれば、単に 'element.pluginName()'を実行することができます。 – charlietfl