0

別のビュー モデルからのデータがあり、それをドロップダウン メニューに表示しています。他のビュー モデルの各オプションを行ごとに一意にする必要があるため、ユーザーがアイテムをリストに追加すると、そのオプションは使用できなくなります。

これが実際のフィドルです: http://jsfiddle.net/QTUqD/9/

    window.usrViewModel = new function () {
    var self = this;
    window.viewModel = self;

    self.list = ko.observableArray();
    self.pageSize = ko.observable(10);
    self.pageIndex = ko.observable(0);
    self.selectedItem = ko.observable();    
    self.extData = ko.observableArray();    
    extData = ExtListViewModel.list();


    self.edit = function (item) {
        if($('#usrForm').valid()) {
        self.selectedItem(item);
        }
    };

    self.cancel = function () {
        self.selectedItem(null);
    };

    self.add = function () {
        if($('#usrForm').valid()) {
        var newItem = new Users();
        self.list.push(newItem);
        self.selectedItem(newItem);
        self.moveToPage(self.maxPageIndex());
        };
    };
    self.remove = function (item) {

            if (confirm('Are you sure you wish to delete this item?')) {

                    self.list.remove(item);
                    if (self.pageIndex() > self.maxPageIndex()) {
                        self.moveToPage(self.maxPageIndex());
                    }

            }
            $('.error').hide();

    };
    self.save = function () {

        self.selectedItem(null);

    };

    self.templateToUse = function (item) {
        return self.selectedItem() === item ? 'editUsrs' : 'usrItems';
    };

    self.pagedList = ko.dependentObservable(function () {
        var size = self.pageSize();
        var start = self.pageIndex() * size;
        return self.list.slice(start, start + size);
    });
    self.maxPageIndex = ko.dependentObservable(function () {
        return Math.ceil(self.list().length / self.pageSize()) - 1;
    });
    self.previousPage = function () {
        if (self.pageIndex() > 0) {
            self.pageIndex(self.pageIndex() - 1);
        }
    };
    self.nextPage = function () {
        if (self.pageIndex() < self.maxPageIndex()) {
            self.pageIndex(self.pageIndex() + 1);
        }
    };
    self.allPages = ko.dependentObservable(function () {
        var pages = [];
        for (i = 0; i <= self.maxPageIndex() ; i++) {
            pages.push({ pageNumber: (i + 1) });
        }
        return pages;
    });
    self.moveToPage = function (index) {
        self.pageIndex(index);
    };

};

ko.applyBindings(usrViewModel, document.getElementById('usrForm'));

function Users(fname, lname, email, phone, access, usrExtVal){
    this.fname = ko.observable(fname);
    this.lname = ko.observable(lname);
    this.email = ko.observable(email);
    this.phone = ko.observable(phone);
    this.access = ko.observable(access);
    this.usrExtVal = ko.observableArray(usrExtVal);   
}

<form id="usrForm">
<h2>Users</h2>
<table class="table table-striped table-bordered">
    <thead>
        <tr>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Email</th>
            <th>Phone Number</th>
            <th>Access</th>
            <th>Extension</th>
            <th style="width: 100px; text-align:right;" />
        </tr>
    </thead>
   <tbody data-bind=" template:{name:templateToUse, foreach: pagedList }"></tbody>
</table>
<p class="pull-right"><a class="btn btn-primary" data-bind="click: $root.add" href="#" title="edit"><i class="icon-plus"></i> Add Users</a></p>
<div class="pagination pull-left">
    <ul><li data-bind="css: { disabled: pageIndex() === 0 }"><a href="#" data-bind="click: previousPage">Previous</a></li></ul>
    <ul data-bind="foreach: allPages">
        <li data-bind="css: { active: $data.pageNumber === ($root.pageIndex() + 1) }"><a href="#" data-bind="text: $data.pageNumber, click: function() { $root.moveToPage($data.pageNumber-1); }"></a></li>
    </ul>
    <ul><li data-bind="css: { disabled: pageIndex() === maxPageIndex() }"><a href="#" data-bind="click: nextPage">Next</a></li></ul>
</div>

<br clear="all" />
    <script id="usrItems" type="text/html">
   <tr>
        <td data-bind="text: fname"></td>
        <td data-bind="text: lname"></td>
        <td data-bind="text: email"></td>
        <td data-bind="text: phone"></td>
        <td data-bind="text: access"></td>
        <td data-bind="text: usrExtVal"></td>
        <td class="buttons">
            <a class="btn" data-bind="click: $root.edit" href="#" title="edit"><i class="icon-edit"></i></a>
            <a class="btn" data-bind="click: $root.remove" href="#" title="remove"><i class="icon-remove"></i></a>
        </td>
    </tr>
</script>

 <script id="editUsrs" type="text/html">
   <tr>
        <td><input data-errorposition="b" class="required" name="fname" data-bind="value: fname" /></td>
        <td><input data-errorposition="b" class="required" name="lname" data-bind="value: lname" /></td>
        <td><input data-errorposition="b" class="required" name="email" data-bind="value: email" /></td>
        <td><input data-errorposition="b" class="required" name="phone" data-bind="value: phone" /></td>
        <td><select data-bind="value: access"><option>Employee</option><option>Administrator</option><option>PBX Admin</option><option>Billing</option></select></td>
        <td><select data-bind="options: $root.extOptions, optionsText: 'extension', value: usrExtVal"></select></td>
        <td class="buttons">
            <a class="btn btn-success" data-bind="click: $root.save" href="#" title="save"><i class="icon-ok"></i></a>
            <a class="btn" data-bind="click: $root.remove" href="#" title="remove"><i class="icon-remove"></i></a>
        </td>
   </tr>
</script>
</form>
4

2 に答える 2

0

使用可能なオプションを使用して計算されたオブザーバブルを作成し、完全なリスト ( extData ) から、選択したアイテムで使用されているものを除いて、アイテムに既に割り当てられているものを除外し、選択フィールドのオプションを計算されたものにバインドします。完全なリストの代わりに。

于 2013-03-30T18:08:57.140 に答える