0

この質問で受け入れられた回答に触発されたコードを使用して、ノックアウトで複数のカスケード選択を作成しました( jsFiddle - 投稿の下部にもあるコード)。

それはうまく機能しますが、子の選択を完全に非表示にするのではなく、使用できないときに無効にしたいと思います。

これには簡単なオプションがありますか?

非表示の動作は「with」バインディングによって駆動されるようですが、これは配列のリンク方法に不可欠なようです。

var mainViewModel = null;

var mainViewModelData = {
    "RequestName": "test Name",
    "BusinessLines": [{
        "Id": 1,
        "Title": "Retail",
        "Clusters": [{
            "Id": 1,
            "Title": "Corporate si Trezorerie"},
        {
            "Id": 2,
            "Title": "Good Bee"},
        {
            "Id": 3,
            "Title": "Leasing"}]},
    {
        "Id": 2,
        "Title": "Corporate",
        "Clusters": [{
            "Id": 1,
            "Title": "REM"},
        {
            "Id": 2,
            "Title": "BCR Procesare"},
        {
            "Id": 3,
            "Title": "Erste Asset Management"}]}],
    "SelectedBusinessLine": null,
    "SelectedCluster": null,
    "RequirementHighLevelDescription": null,
    "Revenues": 0,
    "Savings": 0,
    "PreventedLosses": 0
};

mainViewModel = ko.mapping.fromJS(mainViewModelData);

ko.applyBindings(mainViewModel);

<div>         
<table>            
  <tr>      
    <td>      
        Business Line    
      </td>
      <td>
          <select data-bind="options: BusinessLines,                                                         optionsText: 'Title',                                                           value: SelectedBusinessLine,  
                             optionsCaption: 'Select Business Line..'">
                 </select>           
             </td>
    </tr>

    <tr data-bind="with: SelectedBusinessLine">
        <td>
            Cluster
        </td>
        <td>              <select data-bind="options: Clusters,                                        optionsText: 'Title',                                                        value: $root.SelectedCluster,                                                        optionsCaption: 'Select Cluster..'">   
            </select>
        </td>
    </tr>
    </table>
</div>
4

2 に答える 2

1

それはそれほど些細なことではありませんが、可能です...

最初に、すべての BusinessLine のすべてのクラスターを、parentクラスターの親 BusinessLine オブジェクトを保持するプロパティとマージする、計算されたオブザーバブルを作成します。

mainViewModel.AllClusters = ko.computed(function(){
    var result = [];
    ko.utils.arrayForEach(this.BusinessLines(), function(line){
        ko.utils.arrayForEach(line.Clusters(), function(cluster){
            result.push({ parent: line, Title: cluster.Title() });
        });
    });
    return result;
}, mainViewModel);

次に、プロパティの比較結果<option/>に応じて、各クラスターの「無効」属性を設定/削除する、新しいタイプのバインディング enabledOptions を作成する必要があります。parent

ko.bindingHandlers.enabledOptions = {
    update: function(element, valueAccessor, allBindings) {

        var options = element.getElementsByTagName('option'),
            parent = ko.utils.unwrapObservable(valueAccessor()),
            // delta is neccessary to strip select's caption if it exists
            delta = allBindings().optionsCaption ? 1 : 0;

        for (var i = delta; i < options.length; i++) {
            var cluster = mainViewModel.AllClusters()[i - delta];
            cluster.parent == parent
            ? options[i].removeAttribute('disabled')
            : options[i].setAttribute('disabled', 'disabled')
        }

    }
}

最後に、言及したバインディングを削除しwithます。

その結果、次のようなものが得られます: http://jsfiddle.net/ostgals/x2qMg/28/

于 2013-02-09T14:04:13.697 に答える
0

バインディングを削除し、withバインディングを にバインドoptionsSelectedBusinessLine().Clustersます。

次に、無効化バインディングを使用して選択を無効にします。

于 2013-02-08T17:27:20.010 に答える