簡體   English   中英

如何使用Knockout映射插件映射到來自服務器對象的數組並進行一些計算?

[英]How to map to an Array coming from server object using Knockout Mapping plugin and have some computed?

在stackoverflow上閱讀了這篇題為“如何使用模板中的Knockout映射插件來映射到來自服務器對象的數組的交換”? (對不起,stackoverflow使我對帖子的鏈接數有所限制)我試圖利用答案(jsFiddle: http : //jsfiddle.net/ueGAA/1 )玩游戲

因此,練習的目的是要在Learn.knockoutjs.com上使用名為kockoutjs的教程,名為“加載和保存數據”,但要使用knockout映射。

問題是答案的一種視圖模型聲明,我喜歡將其轉換為待辦事項:

var viewModel = 
{
    tasks : ko.mapping.fromJS(data),
    newTaskText: ko.observable(),
    incompleteTasks: ko.computed(function() {     
           return ko.utils.arrayFilter(this.tasks(), function(task) { return !task.isDone() });
    }),
    // Operations
    addTask:  function() {
        alert('Entering add task, count:' + this.tasks().length);
        this.tasks.push(new Task({ title: this.newTaskText() }));
        this.newTaskText("");
    },
    removeTask: function(task) { this.tasks.remove(task) }

}

關鍵是在這里:在ko.computed()的聲明內, 是引用window 確實很正常。 如果我在vewmodel變量聲明ko.computed() 則可以獲得正確的行為。

這條路:

viewModel.incompleteTasks=ko.computed(function() {
    return ko.utils.arrayFilter(viewModel.tasks(), function(task) { return !task.isDone() });
});

我不喜歡它,因為它在匿名函數中靜態引用了對象viewModel。
問題是:如何以優雅的方式直接在viewmodel聲明中聲明incompleteTasks? jsFiddle在這里http://jsfiddle.net/Yqg8e/

謝謝

從使用對象文字切換到ViewModel的構造函數。

function ViewModel() {
    var self = this;

    self.tasks = ko.mapping.fromJS(data);
    self.newTaskText = ko.observable();
    self.incompleteTasks = ko.computed(function() {       
        return ko.utils.arrayFilter(self.tasks(), function(task) { 
            return !task.isDone()
        });
    });
    self.addTask = function() {
       alert('Entering add task, count:' + self.tasks().length);
       self.tasks.push(new Task({ title: self.newTaskText() }));
       self.newTaskText("");
    };
    self.removeTask = function(task) { self.tasks.remove(task) }
}

ko.applyBindings(new ViewModel());​

注意使用var self = this; 甚至允許在內部匿名函數中訪問this上下文。

該技術在Knockout文檔的“ 可計算的可觀察對象 ”部分中進行了描述(跳到名為“ 管理'this'”的部分)。

這是更新的小提琴: http : //jsfiddle.net/Yqg8e/1/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM