【问题标题】:Knockout.JS: get dataKnockout.JS:获取数据
【发布时间】:2016-07-22 22:54:32
【问题描述】:

我知道这可能看起来太简单了,但我正在尝试了解 Knockout 的工作原理。我究竟做错了什么 ?我需要为每个学生获取有关“Note”的数据,但我尝试过的方法似乎不起作用......我将不胜感激任何帮助或建议。

 <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());

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

【问题讨论】:

  • 由于您收到 HTTP 错误 400(错误请求),您必须检查生成此错误的服务器端脚本。您还可以在浏览器的开发工具中检查所有网络请求和响应(默认为 F12 键)。

标签: knockout.js


【解决方案1】:

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

这表示这个函数:

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

不会打电话给loadNote。您需要另一组括号来调用新创建的函数:

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

最好不要在数据绑定中创建新函数,尤其是在您对淘汰赛不熟悉的情况下。 click 参数和 bindingContext 可能会有点混乱。

我建议在您的视图模型中添加一个onLoadNoteClick 方法,将您的绑定更改为click: onLoadNoteClick,并在此方法中创建一个断点。然后,您可以检查arguments 以查看传递了什么,并检查this 以查看方法的上下文。

【讨论】:

  • 我收到“加载资源失败:服务器响应状态为 400(错误请求)”
【解决方案2】:

在你的函数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();
    };

【讨论】:

  • 加载资源失败:服务器响应状态为 400 (Bad Request)
  • 我该如何解决?
  • 正如@f_martinez 在他的评论中提到的那样,目前您能做的最好的事情就是使用浏览器工具 (F12) 检查对服务器的调用。很可能您的淘汰赛/javascript 工作正常,但您的服务器调用不正确。您是否已经测试过$.getJSON('api/student/'+searchedId) 并看到它返回了什么?
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2018-01-25
  • 2012-12-10
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多