Knockout.JS:获取数据

时间:2016-07-22 14:27:02

标签: knockout.js

我知道这似乎太容易了,但我正在努力了解Knockout的工作原理。我究竟做错了什么 ?我需要为每个学生提供有关“注意”的数据,但我尝试的方法似乎并不起作用......我会感激任何帮助或建议。

 <table data-bind="foreach: students">
        <tr>
            <th>ID</th>
            <th>Nume</th>
            <th>Prenume</th>
            <th>Data</th>
        </tr>
        <tr>
            <td><input type="text" size="1" data-bind="value: StudId" disabled="disabled"></td>
            <td><input type="text" size="60" data-bind="value: Nume" disabled="disabled"></td>
            <td><input type="text" size="60" data-bind="value: Prenume" disabled="disabled"></td>
            <td>
                <input type="text" size="15" data-bind="value: Data" disabled="disabled">
                <input data-bind="click: $parent.deleteStudent.bind($parent, $data.StudId)" type="button" value="Sterge" class="button button1" id="sterge" />
                <input data-bind="click: function() { $parent.loadNote.bind($parent, $data.StudId); alert(NotaId); }" type="button" class="button button2" value="Note" />
            </td>
        </tr>
    </table>

淘汰赛:

 <script type="text/javascript">
        var uri = 'api/student';

        var StudentsViewModel = function () {
            this.students = ko.observableArray();
            this.note = ko.observableArray();

            this.loadNote();
            this.loadStudents();
        };

        StudentsViewModel.prototype.loadStudents = function () {
            var self = this;
            $.getJSON(uri, function (data) {
                self.students(data);
            });
        };

        StudentsViewModel.prototype.loadNote = function (id) {
            var self = this;
            $.getJSON(uri + '/' + id, function (data) {
                self.note(data);
            });
        };
// Apply bindings
        ko.applyBindings(new StudentsViewModel());

当我按下每个学生的按钮时,为什么不显示“注意”?

2 个答案:

答案 0 :(得分:1)

当您在某个函数上调用bind时,该函数不会被称为 。相反,bind会返回带有绑定this上下文和可选绑定参数的 new 函数。

这意味着这个功能:

function() { 
  $parent.loadNote.bind($parent, $data.StudId); 
  alert(NotaId); 
}

不会致电loadNote。你需要另一组括号来调用新创建的函数:

$parent.loadNote.bind($parent, $data.StudId)(); 

最好不要在数据绑定中创建新功能,特别是如果你不熟悉淘汰赛。使用click参数和bindingContext可能会有点混乱。

我建议在您的viewmodel中添加onLoadNoteClick方法,将绑定更改为click: onLoadNoteClick,并在此方法中创建断点。然后,您可以检查arguments以查看已通过的内容,并this查看方法的上下文。

答案 1 :(得分:0)

在您的函数loadNote中,设置var self=this;

如错误所示,当前闭包中没有note函数。 尝试在构造函数中设置self,但不要将其限制在构造函数范围内,以便稍后调用它。

var uri = 'api/student';
var self;
var StudentsViewModel = function () {
    self=this;
    this.students = ko.observableArray();
    this.note = ko.observableArray();
    this.loadNote();
    this.loadStudents();
    };