【问题标题】:knockout data-bindings on save保存时淘汰数据绑定
【发布时间】:2016-05-22 18:03:33
【问题描述】:

我正在使用淘汰赛来修改用户界面。我可以选择通过单击每个文本上的关闭按钮“x”来从屏幕上删除文本。

当我点击保存时,我希望所有剩余的文本都保留在屏幕上,没有关闭按钮,也没有文本周围的输入框。我怎样才能通过淘汰赛实现这一目标。我的代码如下

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>

【问题讨论】:

  • 我冒昧地稍微更改了您问题中的 sn-p,因为它已损坏。如果我的更改有误,请务必还原。​​
  • 不知道为什么它看起来坏了。我试图让用户单击保存时,关闭按钮与输入框一起消失,但文本仅保留在屏幕上。

标签: jquery knockout.js


【解决方案1】:

您需要设置一个 observable 来告诉视图何时保存了项目,然后用不同的标记替换输入和“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>

【讨论】:

  • 如果我想在数组中的每个项目下添加一个滑块怎么办?
  • 我不是 100% 确定您所说的滑块是什么意思。有可能的。我在不同的应用程序中使用了许多绑定滑块,但要让它工作有一些开销。例如,您的字符串数组必须更改为对象数组。 1 个用于字符串的道具,另一个用于滑块值。您还必须做一些工作才能将滑块绑定到 ko 可观察对象中。我过去曾使用自定义绑定来执行此操作
猜你喜欢
  • 1970-01-01
  • 2013-12-30
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2013-02-04
相关资源
最近更新 更多