ノックアウト-複数のドロップダウンメニューをサブスクライブ(選択)してモデルにバインドする方法

アクセルスネル

SO愛好家やJavaScript開発者、

複数のドロップダウンをモデルにバインドし、ドロップダウンごとにその変更イベントを個別にサブスクライブするにはどうすればよいですか?

:私はそのための基本的なフォームを持っている..あなたはそれがjsFiddleに住んで見ることができますhttp://jsfiddle.net/2Mnr3/7/
私は1つを選択すると、すべての選択フィールドが一緒に変わるのはなぜ?どうすれば個別に行うことができますか?

これが私のHTMLです:

<div class='liveExample'> 

<h2>Orders</h2>
<div id='contactsList'>
    <table class='contactsEditor'>
        <tr>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Service</th>
        </tr>
        <tbody data-bind="foreach: contacts">
            <tr>
                <td>
                    <input data-bind='value: firstName' />
                    <div><a href='#' data-bind='click: $root.removeContact'>Delete</a></div>
                </td>
                <td><input data-bind='value: lastName' /></td>
                <td>
                    <table>
                        <tbody data-bind="foreach: services">
                            <tr>

                                <td>

                                    <select data-bind='options: catalog, value: $root.selectedId, optionsText: "name", optionsCaption: "Select..."'> </select>
                                </td>

                                <td>
                                    <div data-bind="visible: $root.selectedId()">
                                        <span data-bind='text: $root.selectedId.price'> </span>
                                        <!--<span data-bind='text: "asd"'> </span>-->
                                    </div>
                                <td>

                                <a href='#' data-bind='click: $root.removeService'>Delete</a></td>
                            </tr>
                        </tbody>
                    </table>
                    <a href='#' data-bind='click: $root.addService'>Add service</a>
                </td>
            </tr>
        </tbody>
    </table>
</div>

<p>
    <button data-bind='click: addContact'>Add customer </button>
    <button data-bind='click: save, enable: contacts().length > 0'>JSON</button>
</p>

<textarea data-bind='value: lastSavedJson' rows='5' cols='60' disabled
          ='disabled'> </textarea>

そして、ノックアウトライブラリを備えたJavascriptコード:

function formatCurrency(value) {
    console.log(value);
    return value;
}

var serviceTypes = [
        { name: "Service One", id: "1", price: "10 USD"},
        { name: "Service Two", id: "2", price: "9 USD"},
        { name: "Service Three", id: "3", price: "25 USD"},
        { name: "Service Four", id: "4", price: "42 USD"}
      ];

var initialData = [
{ firstName: "John", lastName: "Carter", services: [{ catalog: serviceTypes, id: 0 }, { catalog: serviceTypes, id: 2 }]
}
];

   function ContactsModel(contacts) {
    var self = this;
    self.contacts = ko.observableArray(ko.utils.arrayMap(contacts, function(contact) {
        return { id: contact.id, firstName: contact.firstName, lastName: contact.lastName, services: ko.observableArray(contact.services) };
    }));


self.serviceTypes = ko.observableArray(serviceTypes);
self.selectedId = ko.observable('1');

self.selectedId.subscribe(function(item){
    return ko.utils.arrayFirst(serviceTypes, function(service) {
        return service;
    });
});

self.addContact = function() {
    self.contacts.push({
        firstName: "",
        lastName: "",
        services: ko.observableArray([
            {
                catalog: this.serviceTypes,
            }])
    });
};

self.removeContact = function(contact) {
    self.contacts.remove(contact);
};


self.addService = function(contact) {
    contact.services.push({
        catalog: self.serviceTypes,
    });
};

self.removeService = function(phone) {
    $.each(self.contacts(), function() { this.services.remove(phone) })
};

self.save = function() {
    self.lastSavedJson(JSON.stringify(ko.toJS(self.contacts), null, 2));
};

self.lastSavedJson = ko.observable("")
};

ko.applyBindings(new ContactsModel(initialData));
Akhlesh

これの代わりに同じobservable($ root.selectedId)を共有しているので、すべてのカタログにselectedIdの独自のコピーが必要です。そのためには、コンストラクター関数を使用できます。

function Catalog(serviceTypes, d) {
   this.catalog = serviceTypes;
   this.selectedId = ko.observable(d || null);
   this.selectedId.subscribe(function (item) {
     //Subscriber Handler
   });
}
var initialData = [{
  firstName: "John",
  lastName: "Carter",
  services: [new Catalog(serviceTypes, 1), new Catalog(serviceTypes, 2)]
}];

addContactおよびaddService関数も変更されています。

 self.addContact = function () {
    self.contacts.push({
        firstName: "",
        lastName: "",
        services: ko.observableArray([new Catalog(serviceTypes)])
    });
 };

 self.addService = function (contact) {
    contact.services.push(new Catalog(serviceTypes));
 };

フィドルデモ

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ノックアウトモデルデータを複数のテーブルにバインドする方法

分類Dev

スプラッシュを使用してスクレイプでJavaスクリプトのドロップダウンメニューを選択してウェブサイトをクロールする

分類Dev

ブートストラップドロップダウン-ノックアウトバインディングによる切り替えと選択

分類Dev

選択したドロップダウン要素をノードjsを使用してクライアントからサーバーに送信する方法-express

分類Dev

ドロップダウン選択でサブメニューをインデントする方法-WordPress

分類Dev

イオンアプリの角度ドロップダウンメニューでオブジェクトを適切に選択する方法

分類Dev

ノックアウトを使用して1つのページに複数のビューモデルをバインドする方法は?

分類Dev

デスクトップ/ラップトップに固定サイドバーメニューを配置して、モバイル/タブレットでハンバーガーメニューに切り替えるのに苦労している方法

分類Dev

複数のノックアウトビューモデルスクリプトを1つのビューにバインドする

分類Dev

ノックアウトを使用してリストをビューモデルにバインドする

分類Dev

選択リストとしてテーブル内の複数のドロップダウンメニューを使用する

分類Dev

クライアントオブジェクトモデルを使用してSharepointからドロップダウンリストにデータバインド

分類Dev

ノックアウトを使用してドロップダウンリストをバインドする

分類Dev

ノックアウトを使用してドロップダウンリストをバインドする

分類Dev

ブートストラップを適用すると、モバイルデバイスで[選択]ドロップダウンが機能しない

分類Dev

セレンウェブドライバーの複数選択ボックスで要素を選択する方法

分類Dev

セレンウェブドライバーとJavaを介してドロップダウンリストからアイテムを選択する方法

分類Dev

オブジェクトの配列を渡すことでバニラJavaScriptを使用して、レストランメニューのアイテムを格納するドロップダウンメニューを作成しようとしています

分類Dev

トグルアイコンをクリックすると、ブートストラップドロップダウンメニューが消えます

分類Dev

AngularJsのng-repeatを使用せずにドロップダウンメニュー(ブートストラップ)からアイテムを作成して選択する方法

分類Dev

ダッシュプロット-ドロップダウンメニューを動的に作成し、複数の行を選択し、テーブルをエクスポートしますか?

分類Dev

ブートストラップモバイルメニューのドロップダウンがデスクトップバージョンとして表示されます

分類Dev

ドロップダウンメニューを使用して、ノックアウトのある変数に値を割り当てます

分類Dev

サブメニューが選択されている場合、ブートストラップドロップダウンチェックアイコンを追加

分類Dev

同じクラスの複数のドロップダウンに対して選択されたインデックスを取得するには

分類Dev

データベースからのブートストラップ複数ドロップダウンに選択した値を表示する方法

分類Dev

モデル[Angular]のネストされたオブジェクトを使用して選択ドロップダウンにデータを入力する

分類Dev

アイテムをクリックするときにドロップダウンメニューのブートストラップを使用してリストアイテムを編集する

分類Dev

ブートストラップのリンクにドロップダウンメニューを追加する

Related 関連記事

  1. 1

    ノックアウトモデルデータを複数のテーブルにバインドする方法

  2. 2

    スプラッシュを使用してスクレイプでJavaスクリプトのドロップダウンメニューを選択してウェブサイトをクロールする

  3. 3

    ブートストラップドロップダウン-ノックアウトバインディングによる切り替えと選択

  4. 4

    選択したドロップダウン要素をノードjsを使用してクライアントからサーバーに送信する方法-express

  5. 5

    ドロップダウン選択でサブメニューをインデントする方法-WordPress

  6. 6

    イオンアプリの角度ドロップダウンメニューでオブジェクトを適切に選択する方法

  7. 7

    ノックアウトを使用して1つのページに複数のビューモデルをバインドする方法は?

  8. 8

    デスクトップ/ラップトップに固定サイドバーメニューを配置して、モバイル/タブレットでハンバーガーメニューに切り替えるのに苦労している方法

  9. 9

    複数のノックアウトビューモデルスクリプトを1つのビューにバインドする

  10. 10

    ノックアウトを使用してリストをビューモデルにバインドする

  11. 11

    選択リストとしてテーブル内の複数のドロップダウンメニューを使用する

  12. 12

    クライアントオブジェクトモデルを使用してSharepointからドロップダウンリストにデータバインド

  13. 13

    ノックアウトを使用してドロップダウンリストをバインドする

  14. 14

    ノックアウトを使用してドロップダウンリストをバインドする

  15. 15

    ブートストラップを適用すると、モバイルデバイスで[選択]ドロップダウンが機能しない

  16. 16

    セレンウェブドライバーの複数選択ボックスで要素を選択する方法

  17. 17

    セレンウェブドライバーとJavaを介してドロップダウンリストからアイテムを選択する方法

  18. 18

    オブジェクトの配列を渡すことでバニラJavaScriptを使用して、レストランメニューのアイテムを格納するドロップダウンメニューを作成しようとしています

  19. 19

    トグルアイコンをクリックすると、ブートストラップドロップダウンメニューが消えます

  20. 20

    AngularJsのng-repeatを使用せずにドロップダウンメニュー(ブートストラップ)からアイテムを作成して選択する方法

  21. 21

    ダッシュプロット-ドロップダウンメニューを動的に作成し、複数の行を選択し、テーブルをエクスポートしますか?

  22. 22

    ブートストラップモバイルメニューのドロップダウンがデスクトップバージョンとして表示されます

  23. 23

    ドロップダウンメニューを使用して、ノックアウトのある変数に値を割り当てます

  24. 24

    サブメニューが選択されている場合、ブートストラップドロップダウンチェックアイコンを追加

  25. 25

    同じクラスの複数のドロップダウンに対して選択されたインデックスを取得するには

  26. 26

    データベースからのブートストラップ複数ドロップダウンに選択した値を表示する方法

  27. 27

    モデル[Angular]のネストされたオブジェクトを使用して選択ドロップダウンにデータを入力する

  28. 28

    アイテムをクリックするときにドロップダウンメニューのブートストラップを使用してリストアイテムを編集する

  29. 29

    ブートストラップのリンクにドロップダウンメニューを追加する

ホットタグ

アーカイブ