2016-02-11 3 views
0

Я использую нокаут для изменения ui. У меня есть возможность удалить текст с экрана, нажав кнопку закрытия «x» на каждом из них.нокаут данные привязки при сохранении

Когда я нажимаю save, я хочу, чтобы весь оставшийся текст оставался на экране без кнопки закрытия и без поля ввода вокруг текста. Как я могу добиться этого с нокаутом. Мой код ниже

var data = { Name: "Test", 
 
    Items: ["sample1", "sample2", "sample3","DESIGN"]  
 
}; 
 

 
function ViewModel(data) { 
 
    var self = this; 
 
    self.Name = ko.observable(data.Name); 
 
    self.Items = ko.observableArray(ko.utils.arrayMap(data.Items, function(item) { 
 
     return { value: ko.observable(item) }; 
 
    })); 
 
            
 
    self.addItem = function() { self.Items.push({ value: ko.observable("") }); }; 
 
    self.removeItem = function(data) { 
 
     self.Items.remove(data); 
 
    }; 
 
    
 
    self.SaveItem = function() { self.Items.push({ value: ko.observable("") }); }; 
 
    self.SaveItem = function(data) { 
 
     self.Items.save(data); 
 
    }; 
 
} 
 
$(document).ready(function() {ko.applyBindings(new ViewModel(data)); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script> 
 
<div> 
 
    Name: <span data-bind="text: Name"></span> 
 
</div> 
 
<div> 
 
    Items: <button data-bind="click: addItem">Add Item</button> 
 
</div> 
 
<div> 
 
    <table> 
 
     <tbody data-bind="template: { name: 'itemTemplate', foreach: Items }"></tbody> 
 
    </table> 
 
</div> 
 
    <button data-bind="click: SaveItem">SAVE</button> 
 
<script type="text/html" id="itemTemplate"> 
 
    <tr> 
 
     <td> 
 
      <input data-bind="value: value" /> 
 
      <a href="#" data-bind="click: $parent.removeItem">X</a> 
 
     </td> 
 
    </tr> 
 
</script>

+0

Я взял на себя смелость немного изменив фрагмент кода в вашем вопросе, так как она была сломана. Пожалуйста, верните мои изменения, если они были неправы. – Jeroen

+0

Не знаете, почему он оказался сломанным. Я пытаюсь, когда пользователь нажимает кнопку «Сохранить», кнопки закрытия исчезают вместе с полями ввода, но текст остается на экране. – vzupo

ответ

1

Вы должны установить наблюдаемый сказать мнению, когда элементы были сохранены, а затем заменить входной и «X» с различными размечать.

var data = { Name: "Test", 
 
    Items: ["sample1", "sample2", "sample3","DESIGN"]  
 
}; 
 

 
function ViewModel(data) { 
 
    var self = this; 
 
    self.saved = ko.observable(false); 
 
    self.Name = ko.observable(data.Name); 
 
    self.Items = ko.observableArray(ko.utils.arrayMap(data.Items, function(item) { 
 
     return { value: ko.observable(item) }; 
 
    })); 
 
            
 
    self.addItem = function() { self.Items.push({ value: ko.observable("") }); }; 
 
    self.removeItem = function(data) { 
 
     self.Items.remove(data); 
 
    }; 
 
    
 
    self.SaveItem = function() { self.Items.push({ value: ko.observable("") }); }; 
 
    self.SaveItem = function(data) { 
 
     //self.Items.save(data); I have no idea what you are doing here 
 
     self.saved(true); 
 
    }; 
 
} 
 
$(document).ready(function() {ko.applyBindings(new ViewModel(data)); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script> 
 
<div> 
 
    Name: <span data-bind="text: Name"></span> 
 
</div> 
 
<div> 
 
    Items: <button data-bind="click: addItem">Add Item</button> 
 
</div> 
 
<div> 
 
    <table> 
 
     <tbody data-bind="template: { name: 'itemTemplate', foreach: Items }"></tbody> 
 
    </table> 
 
</div> 
 
    <button data-bind="click: SaveItem">SAVE</button> 
 
<script type="text/html" id="itemTemplate"> 
 
    <tr> 
 
     <td data-bind="visible: !$parent.saved()"> 
 
      <input data-bind="value: value" /> 
 
      <a href="#" data-bind="click: $parent.removeItem">X</a> 
 
     </td> 
 
     <td data-bind="visible: $parent.saved()"> 
 
      <span data-bind="text: value"></span> 
 
     </td> 
 
    </tr> 
 
</script>

+0

Что делать, если я хочу добавить слайдер под каждый элемент массива? – vzupo

+0

Я не уверен на 100%, что вы подразумеваете под слайдером. Возможно. Я использую несколько связанных слайдеров в разных приложениях, но есть некоторые накладные расходы, чтобы заставить его работать. Например, ваш массив строк должен быть изменен для массива объектов. 1 prop для строки и другой для значения ползунка. Вам также нужно будет сделать какую-то работу, чтобы заставить слайдер привязаться к наблюдаемому ко. Я использовал пользовательские привязки в прошлом, чтобы сделать это – QBM5

Смежные вопросы