Наблюдаемый массив Knockout.js с событием onlick

0

Привет, у меня есть веб-приложение, я очень новичок в KnockOut.js

У меня есть JS COde

ko.applyBindings(new LOBViewModel());
//COMMENTED SECTION BINDS THE DATA TO HTML, BUT DOES NOT TRIGGER ONLICK EVENT
//function LOBViewModel() {
//    var self = this;

//    self.vm = {
//        LOBModel: ko.observableArray()
//    };

//    GetLOB();
//
//    self.DeleteRecord = function (lobmodel) {
//        $.ajax({
//            type: "POST",
//            url: '/Admin/DeleteLOB',
//            data : {LOB_ID : lobmodel.LOB_ID},
//            success: function (data)
//            {
//                alert("Record Deleted Successfully");
//                GetLOB();//Refresh the Table
//            },
//            error: function (error)
//            {
//            }
//        });

//    };
//    function GetLOB() {
//        $.ajax({
//            url: '/Admin/GetLOB',
//            type: "POST",
//            dataType: "json",
//            success: function (returndata) {
//                self.vm.LOBModel = returndata;
//                ko.applyBindings(self.vm);
//                alert("Hello");

//            },
//            error: function () {
//            }
//        });
//    };
//}
//UNCOMMENTED SECTION DOES NOT BIND THE DATA TO HTML
function LOBViewModel() {
    var self = this;
self.LOBModel = ko.observableArray([]);  

GetLOB();

self.DeleteRecord = function (lobmodel) {
    $.ajax({
        type: "POST",
        url: '/Admin/DeleteLOB',
        data: { LOB_ID: lobmodel.LOB_ID },
        success: function (data) {
            alert("Record Deleted Successfully");
            GetLOB();//Refresh the Table
        },
        error: function (error) {
        }
    });

};

function GetLOB() {
    $.ajax({
        url: '/Admin/GetLOB',
        type: "POST",
        dataType: "json",
        success: function (returndata) {
            self.LOBModel = returndata;
            alert(self.LOBModel.length);
        },
        error: function () {
            alert("eRROR GET LOB");
        }
    });
};

}

Подробности My Json находится в следующем формате [0] => {LOB_ID: 0, LOB_Name: "data" LOB_description: "data"} [1] => и т.д.

Файл HTML

        <tbody data-bind="foreach: LOBModel">
        <tr>
            <td data-bind="text:LOB_ID"></td>
            <td data-bind="text: LOB_Name"></td>
            <td data-bind="text: LOB_Description"></td>
            <td><button data-bind="click: $root.DeleteRec">Delete</button></td>

        </tr>
    </tbody>

Мой вопрос:

почему это

  1. я должен использовать vm для привязки json к LOADModel, чтобы он работал, когда я использую self.LOBModel = ko.observableArray([]); привязки не происходит. т.е. моя таблица не загружает данные.
  2. мой Onlick не запускается в обеих версиях кода, я пробовал self.DeleteRec, $root.DeleteRec and just DeleteRec. Хотя кажется очень очевидным, это просто не работает.
  3. Будет ли DeleteRec знать, какую запись я удаляю. lobmodel.LOB_ID правильный способ использования?
Теги:
knockout.js

1 ответ

2
Лучший ответ

Чтобы ответить на вопрос по пунктам:

(1) Ваша проблема в функции GetLOB, в этой строке:

self.LOBModel = returndata;

При этом вы перезаписываете self.LOBModel = ko.observableArray([]). Вместо этого вы должны сделать следующее:

self.LOBModel(returndata);

Затем вы должны увидеть данные в своей таблице (если у вас нет других ошибок). Здесь следует помнить, что если вы делаете переменную наблюдаемой, вам всегда нужно использовать() -syntax для чтения или записи базового значения. Если вы используете = вместо этого, вы удаляете наблюдаемую функциональность.

(2) подход с "$ root.DeleteRecord" верен. "self.DeleteRecord" не будет работать, и ни один из них не будет просто DeleteRecord. То, что также будет работать, - $ parent.DeleteRecord. Кажется, проблема заключается в том, что вместо "DeleteRecord" вы выполняете "DeleteRec".

(3) ваш подход является правильным. Удалили мои комментарии по этому поводу, так как Ричард Далтон под мной сделал правильный комментарий, который делает недействительным то, что я набрал здесь.

Изменение: рабочий скрипт http://jsfiddle.net/LFgUu/4/

  • 1
    Хороший ответ, кроме 3 - «При вызове вашего обработчика Knockout предоставит текущее значение модели в качестве первого параметра». - knockoutjs.com/documentation/click-binding.html
  • 0
    Ты прав. Отредактировал мой ответ.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню