1

我在敲除 viewmodel 的对象文字中定义了一个可观察对象。现在当我运行应用程序时。它无法访问 observable 。

$(function () {
  var viewModel =    {
    Folders: ['Inbox', 'Archive', 'Sent', 'Spam'],
    Title: ko.observable("My View Model Test"),
    SelectedFolder: ko.observable(),
    Mails: ko.observableArray(),
    SelectedMail: ko.observable(),
    SelectedChoices: ko.observable(false),


    navigate: function (folder) {           
        SelectedFolder(folder);
        $.ajax({
            url: "/Api/MailBox",
            data: { folder: folder },
            success: function (data) {
                self.Mails(data);
            },
            statusCode: {
                404: function () {
                    console.log("No Mails");
                }
            }

        });
    }
};
}

当我将点击事件绑定到navigate函数时。它说SelectedFolder是 undefined 。有人能告诉我为什么它无法访问函数SelectedFolder内部的 observable吗?navigate

4

2 回答 2

2

当 navigate 方法运行并寻找 SelectedFolder observable 时,它​​首先在 navigate 方法的上下文中寻找它。否则,它会跳转到父上下文,这是页面准备就绪时正在运行的匿名函数。如果做不到这一点,它会跳转到全局上下文 - 它在那里找不到 SelectedFolder,所以它放弃了。

要解决此问题,请更改您的导航方法以引用在页面准备好时正在运行的匿名函数的上下文中可用的 viewModel 变量:

navigate: function (folder) {           
  viewModel.SelectedFolder(folder);
  $.ajax({
    url: "/Api/MailBox",
    data: { folder: folder },
    success: function (data) {
      viewModel.Mails(data);
    },
    ...

请注意,我还在成功回调中添加了对 viewModel 的引用,以便它可以找到 Mails observable。

这应该可行,但是,我建议考虑更改您的结构,以便您的导航方法不依赖于特定的全局变量。这是一种方法:

var myViewModel = function() {
    var self = this;
    self.Folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
    self.Title = ko.observable("My View Model Test");
    self.SelectedFolder = ko.observable();
    self.Mails = ko.observableArray();
    self.SelectedMail = ko.observable();
    self.SelectedChoices = ko.observable(false);

    self.navigate = function (folder) {           
        self.SelectedFolder(folder);
        $.ajax({
            url: "/Api/MailBox",
            data: { folder: folder },
            success: function (data) {
                self.Mails(data);
            },
            statusCode: {
                404: function () {
                    console.log("No Mails");
                }
            }

        });
    };
};

$(function () {
  var ViewModel = new myViewModel();
  ko.applyBindings(viewModel);
});
于 2012-12-21T15:22:23.200 回答
1

问题可能是调用该方法时的当前上下文。如果该方法被单击事件调用,this则可能是单击事件绑定到的对象,因此它会尝试在该元素上查找 SelectedFolder 方法。

不确定这是否是最好的方法,但这是一种可能的解决方案:

var viewModel =    {
  Folders: ['Inbox', 'Archive', 'Sent', 'Spam'],
  Title: ko.observable("My View Model Test"),
  SelectedFolder: ko.observable(),
  Mails: ko.observableArray(),
  SelectedMail: ko.observable(),
  SelectedChoices: ko.observable(false)
};

viewModel.navigate = function (folder) {           
  viewModel.SelectedFolder(folder);
  $.ajax({
    url: "/Api/MailBox",
    data: { folder: folder },
    success: function (data) {
      viewModel.Mails(data);
    },
    statusCode: {
      404: function () {
        console.log("No Mails");
      }
    }
});
于 2012-12-21T15:01:04.697 回答