2013-03-12 4 views
5

私は、アプリケーション内でディレクティブを使ってjQueryマルチセレクトプラグインを実装しようとしています。ここでは」select要素:ng-optionsがDOMの更新を完了した時期はどうすればわかりますか?

<select multiple 
     ng-model="data.partyIds" 
     ng-options="party.id as party.name for party in parties" 
     xs-multiselect="parties"> 
</select> 

モデルpartiesモデルが$ HTTP経由でロードされます。マルチセレクションプラグインは、select内のoption要素を解析し、素敵なマルチセレクトを生成します。

select要素にオプションが設定されていることを検出する方法はありますか?そのため、マルチセレクションプラグインにデータを更新するよう指示できますか?ここで

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

machineXs.directive("xsMultiselect", function() { 
    return { 
     restrict: "A", 
     require: '?ngModel', 
     link: function(scope, element, attrs, ngModel) { 
      element.multiselect().multiselectfilter(); 
      scope.$watch(scope[attrs["xsMultiselect"]], function() { 
       // I tried watching but it doesn't help 
       element.multiselect('refresh'); 
       element.multiselectfilter("updateCache"); 
      }); 
     } 
    } 
}); 
+0

をあなたの$時計内部では、$タイムアウトを呼び出してみてください - すなわち、タイムアウトコールバック関数内で複数選択のものを置きます。これにより、ng-optionsディレクティブが実行され、DOMにオプションを追加することができます。 –

+0

これは機能しません。私は$ watchを正しく設定しましたか? – lucassp

+0

それは私には大丈夫です。私の提案がうまくいくかどうかはわかりませんでした。 Angularは、レンダリングが完了したときに実際に信号を送る方法はありません。ときには$ timeoutが動作することもありますが、必ずしもそうではありません –

答えて

5

コメントで述べたように、私は時計がngOptionsはDOMを更新したときに対トリガしたときにはよく分からない

scope.$watch(attrs.xsMultiselect, ...) 

を使用しています。時計があまりにも早く起動していることがわかった場合は、$evalAsync()または$ timeout()を試してみてください。 $ evalAsyncは後で実行されますが、DOMがレンダリングされる前に実行されます。 $ timeout()は、DOMレンダリング後に後で実行されます。

scope.$watch(attrs.xsMultiselect, function() { 
    scope.$evalAsync(function() { 
     element.multiselect('refresh'); 
     element.multiselectfilter("updateCache"); 
    }); 
}); 

や、DOMのレンダリング後:

scope.$watch(attrs.xsMultiselect, function() { 
    $timeout(function() { 
     element.multiselect('refresh'); 
     element.multiselectfilter("updateCache"); 
    }); 
}); 
+0

これは角度1.5.6では機能しません。DOMが更新される前に起動します。何か案は?! – Campbeln

関連する問題