【问题标题】:KnockOutJS trigger parent function on child subscribeKnockOutJS 在子订阅上触发父函数
【发布时间】:2013-03-20 18:15:24
【问题描述】:

我目前正在尝试学习 KnockOutJS。我认为创建一个简单的任务列表应用程序是个好主意。 我不想在这里写长文,让我们深入探讨我的问题。我感谢各种帮助 - 我是 KnockOutJS 的新手!

任务声明如下:

var Task = function (data) {
    var self = this;

    self.name = ko.observable(data.name);
    self.status = ko.observable(data.status);
    self.priority = ko.observable(data.priority);
}

视图模型看起来像这样

var TaskListViewModel = function() {
var self = this;

self.currentTask = ko.observable();
self.currentTask(new Task({ name: "", status: false, priority: new Priority({ name: "", value: 0 }) }));

self.tasksArr = ko.observableArray();

self.tasks = ko.computed(function () {
    return self.tasksArr.slice().sort(self.sortTasks);
}, self);

self.sortTasks = function (l, r) {
    if (l.status() != r.status()) {
        if (l.status()) return 1;
        else return -1;
    }

    return (l.priority().value > r.priority().value) ? 1 : -1;
};

self.priorities = [
    new Priority({ name: "Low", value: 3 }),
    new Priority({ name: "Medium", value: 2 }),
    new Priority({ name: "High", value: 1 })
];

// Adds a task to the list
// also saves updated task list to localstorage
self.addTask = function () {
    self.tasksArr.push(new Task({ name: self.currentTask().name(), status: false, priority: self.currentTask().priority() }));
    self.localStorageSave();

    self.currentTask().name("");
};

// Removes a task to a list
// also saves updated task list to localstorage
self.removeTask = function (task) {
    self.tasksArr.remove(task);
    self.localStorageSave();
};

// Simple test function to check if event is fired.
self.testFunction = function (task) {
    console.log("Test function called");
};

// Saves all tasks to localStorage
self.localStorageSave = function () {
    localStorage.setItem("romaTasks", ko.toJSON(self.tasksArr));
};

// loads saved data from localstorage and parses them correctly.
self.localStorageLoad = function () {
    var parsed = JSON.parse(localStorage.getItem("romaTasks"));
    if (parsed != null) {
        var tTask = null;
        for (var i = 0; i < parsed.length; i++) {
            tTask = new Task({
                name: parsed[i].name,
                status: parsed[i].status,
                priority: new Priority({
                    name: parsed[i].priority.name,
                    value: parsed[i].priority.value
                })
            });
            self.tasksArr.push(tTask);
        }
    }
};
self.localStorageLoad();
}

我想在我的 html 中做的事情非常简单。 我添加的所有任务都保存到 localStorage。如您所见,每次添加和删除元素时都会调用 save 函数。但是我也想在每个任务的状态一改变就保存,但是这里不能用subscribe,比如

self.status.subscribe(function() {});

因为我无法从 Task 类访问 self.tasksArr。

有什么想法吗?是否有可能以某种方式将 self.tasksArr 公开?

提前致谢!

【问题讨论】:

  • RP Niemeyer 来了!
  • 为什么不在您的addTask() 方法中订阅它?创建任务,然后订阅status。我不是 100% 确定,但我相信处理程序,this 会指向您的 ko.observable() 以获取 status
  • hm.. 订阅 addTask 方法?不太确定那会想要什么。您的意思是在创建任务时: var status = ko.observable(false); status.subscribe(function() { // 做点什么 }); listOfTasks.push(新任务({status:status}));像这样的东西?或者你是什么意思?
  • 不,订阅addTask 函数内的Task.status(当您创建Task 时)。沿线task=new Task(...); task.status.subscribe(function(newValue) {...})
  • 这解决了!非常感谢!不知道这是可能的。

标签: javascript mvvm knockout.js


【解决方案1】:

试试这个:

self.addTask = function () {
  var myTask = new Task({ name: self.currentTask().name(), status: false, priority: self.currentTask().priority() })
  myTask.status.subscribe(function (newValue) {
    self.localStorageSave();
  });
  self.tasksArr.push(myTask);
  self.localStorageSave();
  self.currentTask().name("");
};

【讨论】:

  • 是的,这行得通!与@Pete 在他上一条评论中描述的完全一样。谢谢!
  • 哇,我怎么没想到呢?哦,等等,我做到了!
猜你喜欢
  • 2021-12-27
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多