将参数发送给函数时,如何删除单击的行?昏死

时间:2018-08-20 15:43:15

标签: javascript knockout.js html-table

我在删除服务方面有些麻烦。我具有删除服务器上服务的功能,但必须重新加载页面以更新表。我找到了如何通过单击绑定来删除行的方法,但是存在一个问题,因为我只能从服务器中删除行或获取用于删除服务的ID,而不能同时应用于两者。 :/

  

这是删除服务器上的服务但不删除表行的代码示例。

HTML:

<table id="serviceView" class="fixed_header" border: 1>
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Adress</th>
                    <th>Notification</th>
                </tr>
            </thead>
            <tbody  data-bind="foreach: services">
                <tr>
                    <td data-bind="text: name"></td>
                    <td data-bind="text: address"></td>
                    <td data-bind="text: serviceId"></td>
                    <td ><button data-bind="click: $parent.DeleteService.bind(this, serviceId)">Remove</button></td> 
                </tr>
            </tbody>

        </table>

JS:

self.services = ko.observableArray([]); 
    self.lastCheck = ko.observable();
    $.getJSON("http://localhost:55972/api/status", function (data) {
        self.services(data.services);
        self.lastCheck = data.lastCheck;
    });    //////This is loading data to the table from server

    self.DeleteService = function (serviceId) {
        $.ajax({
            type: "GET",
            url: "http://localhost:55972/api/services/remove/" + serviceId,
        }).done(function () {
            self.services.remove(serviceId)
        })

    };  
  

这是删除表行的代码示例

当我像这样使用单击绑定时:

<button data-bind="click: $parent.DeleteService">Remove</button>

并将删除功能更改为此:

self.DeleteService = function (serviceId) {
        self.services.remove(serviceId)
        $.ajax({
            type: "GET",
            url: "http://localhost:55972/api/services/remove/" + serviceId,
        }).done(function () {
            // here I want to remove row but i doesnt goes here without service ID.
        })

    };

它删除行,但我在URL中获得了[object,object]的serviceId。

您能帮我吗?我有主意使用jquery来更新表,但是当我可以使用淘汰赛时,这对我来说似乎不必要地复杂。

我知道解决方案并不难,但我无法解决..... -_-

很抱歉花点时间处理这些废话,但这是我第一个真正的项目,在这一点上我实在太绝望了,因为我有很多事情要做,我对此很执着。

2 个答案:

答案 0 :(得分:1)

在您的Js代码中,您可以尝试以下操作:

self.services = ko.observableArray([]); 
    self.lastCheck = ko.observable();
    $.getJSON("http://localhost:55972/api/status", function (data) {
        self.services(data.services);
        self.lastCheck = data.lastCheck;
    });    //////This is loading data to the table from server
var serviceIdRemoved; 
    self.DeleteService = function (serviceId) {
serviceIdRemoved = serviceId; // now you can do whatever you need more with this value
        $.ajax({
            type: "GET",
            url: "http://localhost:55972/api/services/remove/" + serviceId,
        }).done(function () {
            self.services.remove(serviceId)
        })

    }; 

通过这种工作方式,您可以使用变量的内容,而不会丢失它。另外,如果您获得[Object,Object],则可以:

console.log(serviceId) // to see the content in the console.

JSON.stringify(data) //to see the content in html

This source could help you以更好地理解它。

答案 1 :(得分:1)

您看到的[object,object]实际上是Knockout秘密添加到JS函数参数中的数据和事件对象。如果要将自己的参数添加到click绑定中,则应这样做:

<button data-bind="click: function(data, event) { $parent.DeleteService(serviceId, data, event) }">Remove</button>

然后您可以按以下方式定义JS函数:

self.DeleteService = function (serviceId, data, event) {
    [code here...]
}

您可以在出色的Knockout文档中阅读它的确切详细信息: http://knockoutjs.com/documentation/click-binding.html

大约在标题为“ 注2:访问事件对象或传递更多参数”的标题下大约一半