私は狂ったようなカスタムディレクティブに問題があります。 私は次のカスタム(属性)ディレクティブを作成しようとしています:
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);
});
}
}
});
(seatMapと呼ばれる)この「属性型」ディレクティブが(劇場ため、例えば)座席IDのリストを表示しようとしています$ resourceサービス(以下のコードを参照)を介してサーバーからdiv(要素)にフェッチします。
私はこの単純な部分の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;
}
サーバーからJSONを取得するためのリソース
angular.module('myApp.services', ['ngResource'])
.factory('Seats', function($resource){
return $resource('json/seats-:sessionId-:zoneId.json', {}, {});
})
;
app.js(asientos_libres.htmlは、使用EEN):
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'});
}]);
問題はスコープが「席」属性を更新するために変更されているかどうかを確認することができるように、私はディレクティブのリンク機能で「スコープ$ウォッチを。」の設定にもかかわらず、ですidsのリストでは、コントローラーで$ scope.seatsが変更されているときには動作しません(「照会」と呼ばれるとき)。
あなたがコードで表示される場合がありますように、私も試した私が「updateSeatInfo」の発売を延期するために$タイムアウトを使用してみてくださいを作ったが、私はそれがはるかに賢い解決策はありません怖い...
JSONリクエストを作成せず、$ scope.seatsにハードコードされた辞書を使用すると動作しますので、同期の問題があるようです。
注:updateSeatInfoは単なるテスト関数です。使用する実際の関数はもう少し複雑です。
これに対処する方法はありますか。
ありがとうございます!
編集1:アドバイスのためにSuprのおかげで、私がSeatsCtrlを呼び出すためにルータを使用しているapp.jsを追加しました。しかし、私はまだ同じ問題を抱えています。
編集2:解決済み(?) OK!それは最高のものではないかもしれない解決策を見つけたようですが、正常に機能しています! :) 私がここで見ることができる限り、http://docs.angularjs.org/api/ng.$timeoutは、遅延なしで$タイムアウト(ラッパーover setTimeout)を使用することができます!これは、$ timeout内でコードの実行を人為的に遅らせているわけではないため、非同期要求が完了するまで指令を実行しないようにしているため、これは素晴らしいことです。
は
誰かがそれを修正するより良い方法を知っていれば、教えてください...それはあまりにも、長い待ちのリクエストのために働くことを願っています!
注意点:このような深い比較では、パフォーマンスが低下します。 1つのオブジェクトではなくオブジェクトのコレクションを深く見ているときは、ほとんどの場合問題ですが、注意する価値はあります。 –