Как сделать существующую строку доступной только для чтения и вновь добавленную строку в таблице редактируемой

#knockout.js

#knockout.js

Вопрос:

У меня есть требование, при котором мне нужно добавить строку в таблицу со значениями по умолчанию из первой строки, нажав кнопку «добавить строку». Существующая строка должна быть доступна только для чтения, а новая строка должна быть доступна для редактирования.

Мой HTML-код:

 <table>
    <tbody data-bind="foreach: TPItems()">
        <tr>
            <td></td>
            <td><span data-bind="text: beginrange"> </span></td>
            <td><span data-bind="text: endrange"></span></td>
            <td></td>
            <td></td>
            <td><span data-bind="text: lstpricetomu"></span></td>
            <td></td>
            <td><span data-bind=
            "text: offmulptomutp"></span></td>
            <td><span data-bind="text: mltusrtargprice"></span></td>
            <td><button data-bind="click: $root.removePCAttribute">
                Delete Row</button></td>
        </tr>
    </tbody>
</table>

<table>
    <tr>
        <td><button data-bind="click: $root.addPCAttribute">Add
        Row</button></td>
    </tr>
</table>
  

Моя модель представления:

 function PriceCatalogTieredPricingViewModel() {

    var self = this;
    //self.thetest=ko.observable(false);

    self.defaultTPvalues = {
        itemnum: ko.observable("1127"),
        beginrange: ko.observable(""),
        endrange: ko.observable(""),
        multiuserflrprice: ko.observable(" $12.50 "),
        lstprice: ko.observable(" $999.95 "),
        lstpricetomu: ko.observable("0%"),
        mltiusrlstprice: ko.observable(" $999.95 "),
        offmulptomutp: ko.observable("50%"),
        mltusrtargprice: ko.observable(" $499.98 ")
    };

    self.TPItems = ko.observableArray(
    [
    new PCTieredPricingClass({
        itemnum: ko.observable("1127"),
        beginrange: ko.observable("1"),
        endrange: ko.observable("1"),
        multiuserflrprice: ko.observable(" $12.50 "),
        lstprice: ko.observable(" $999.95 "),
        lstpricetomu: ko.observable("0%"),
        mltiusrlstprice: ko.observable(" $999.95 "),
        offmulptomutp: ko.observable("50%"),
        mltusrtargprice: ko.observable(" $499.98 "),
        thetest: ko.observable(false)
    })]);

    self.addPCAttribute = function () {
        self.TPItems.push(new PCTieredPricingClass(self.defaultTPvalues));
    }
}

ko.applyBindings(new PriceCatalogTieredPricingViewModel());
});
  

Комментарии:

1. Используйте привязку шаблона. Один шаблон только для чтения и один для записи.

2. У вас может быть дополнительное поле как редактируемое, которое будет верно для новой строки.

3. спасибо за информацию. Я новичок в knockout, не могли бы вы рассказать мне, как использовать привязку шаблона для этого требования

Ответ №1:

Вы можете добавить дополнительное поле IsEditable следующим образом

 self.defaultTPvalues = {
    itemnum: ko.observable("1127"),
    beginrange: ko.observable(""),
    endrange: ko.observable(""),
    multiuserflrprice: ko.observable(" $12.50 "),
    lstprice: ko.observable(" $999.95 "),
    lstpricetomu: ko.observable("0%"),
    mltiusrlstprice: ko.observable(" $999.95 "),
    offmulptomutp: ko.observable("50%"),
    mltusrtargprice: ko.observable(" $499.98 "),
    isEditble  : ko.observable(false)
};
  

И это будет отличать ваши недавно добавленные строки

 self.addPCAttribute = function () {
    self.defaultTPvalues.isEditble(true)
    self.TPItems.push(new PCTieredPricingClass(self.defaultTPvalues));
}
  

ПРАВКИ

Я предполагаю, что вы будете редактировать или удалять только поле, которое доступно для редактирования, и ничего не будете делать со строками по умолчанию. Вот условная проверка

 <tbody data-bind="foreach: TPItems()">
    <tr>
        <td></td>
        <td><span data-bind="text: beginrange"> </span></td>
        <td><span data-bind="text: endrange"></span></td>
        <td></td>
        <td></td>
        <td><span data-bind="text: lstpricetomu"></span></td>
        <td></td>
        <td><span data-bind=
        "text: offmulptomutp"></span></td>
        <td><span data-bind="text: mltusrtargprice"></span></td>
        <!-- ko if:isEditable -->
        <td><button data-bind="click: $root.removePCAttribute">Delete Row</button></td>
        <!-- /ko -->
        <!-- ko ifnot:isEditable -->
        <td></td>
        <!-- /ko -->            
    </tr>
</tbody>
  

Комментарии:

1. Спасибо за помощь. Я новичок в этом нокауте, не могли бы вы рассказать мне, как использовать это свойство IsEditable в таблице HTML. Я имею в виду, как добавить дополнительное поле как редактируемое. Я не понимаю

2. Является ли редактирование решением моей проблемы?? потому что даже новый код не работает.

3. Кнопка добавления новой строки сама по себе не работает, когда я добавил приведенный выше код. Нужно ли мне добавлять что-либо, кроме приведенного выше кода??