カスタム ディレクティブに問題があり、頭がおかしくなりました。次のカスタム (属性) ディレクティブを作成しようとしています。
angular.module('componentes', [])
.directive("seatMap", function (){
return {
restrict: 'A',
link: function(scope, element, attrs, controller){
function updateSeatInfo(scope, element){
var txt = "";
for (var i in scope.seats)
txt = txt + scope.seats[i].id + " ";
$(element).text("seat ids: "+txt);
}
/*
// This is working, but it's kind of dirty...
$timeout(function(){updateSeatInfo(scope,element);}, 1000);
*/
scope.$watch('seats', function(newval, oldval){
console.log(newval, oldval);
updateSeatInfo(scope,element);
});
}
}
});
この「attribute-type」ディレクティブ (seatMap と呼ばれる) は、$resource サービス (以下のコードを参照) を介してサーバーから div (要素) にフェッチする座席 ID (劇場など) のリストを表示しようとしています。 .
私はこの単純な部分的なhtmlでそれを使用しています:
<div>
<!-- This is actually working -->
<ul>
<li ng-repeat="seat in seats">{{seat.id}}</li>
</ul>
<!-- This is not... -->
<div style="border: 1px dotted black" seat-map></div>
</div>
そして、これはスコープをロードしているコントローラーです:
function SeatsCtrl($scope, Seats) {
$scope.sessionId = "12345";
$scope.zoneId = "A";
$scope.seats = Seats.query({sessionId: $scope.sessionId, zoneId: $scope.zoneId});
$scope.max_seats = 4;
}
"Seats" は、$resources を使用してサーバーから JSON をフェッチする単純なサービスです。
angular.module('myApp.services', ['ngResource'])
.factory('Seats', function($resource){
return $resource('json/seats-:sessionId-:zoneId.json', {}, {});
})
;
app.js (asientos_libres.html は私が使っている部分です):
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'componentes']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {templateUrl: 'partials/asientos_libres.html', controller: SeatsCtrl});
$routeProvider.otherwise({redirectTo: '/view1'});
}]);
問題は、ディレクティブのリンク関数に「scope.$watch」を設定して、スコープが「seats」属性が変更されて ID のリストを更新するかどうかを確認できるようにしたにもかかわらず、それが動作していないことです。コントローラーで $scope.seats が変更されている瞬間 (「クエリ」を呼び出したとき)。
コードでわかるように、$timeout を使用して「updateSeatInfo」の起動を遅らせようとしましたが、これは最も賢明な解決策ではないと思います...
また、JSON リクエストを作成しないようにしましたが、$scope.seats でハードコードされた辞書を使用して動作するため、同期の問題のようです。
注: updateSeatInfo は単なるテスト関数です。実際に使用する関数はもう少し複雑です。
それに対処する方法について何か考えはありますか?
よろしくお願いします!
編集 1:ルーターを使用して SeatsCtrl を呼び出す app.js を追加しました。Supr のアドバイスに感謝します。しかし、私はまだ同じ問題を抱えています。
編集 2: 解決!(?) OK! 最善ではないかもしれない解決策を見つけたようですが、正しく機能しています! :) ここhttp://docs.angularjs.org/api/ng.$timeoutを見ることができる限り、遅延なしで$timeout (setTimeout のラッパー) を使用できます! $timeout 内で人為的にコードの実行を遅らせていないため、これは素晴らしいことですが、非同期リクエストが終了するまでコードを実行しないようにディレクティブを作成しています。
待ち時間の長いリクエストにも対応できることを願っています...
誰かがそれを修正するより良い方法を知っているなら、教えてください!