在计算声明中将计算值添加到可观察数组

时间:2014-03-27 03:22:42

标签: javascript jquery knockout.js

我有observableArray()

的视图模型
var userTaskMyViewModel = {
    userTaskMyDetailsDTO: ko.observableArray() 
};

一旦我获得数据,我尝试使用

添加计算函数
  $.each(userTaskMyViewModel.userTaskMyDetailsDTO(), function (index, userTask) {

                userTask.TaskCss = ko.computed(function () {
                    var result = "item-green";
                    if (userTask.Percent == 0)
                        result = "item-red";

                    return result;
                });

问题是我在获取数据之前已经应用了绑定,因为我需要从服务器多次获取数据并添加到此模型中。

因为我在我的视图中使用TaskCss进行数据绑定,所以错误说没有定义。我认为我需要在声明我的ko模型时声明这个     我该怎么做?在计算声明中将计算值添加到可观察数组。

我使用此调用来获取数据并填充模型。

$.ajax({
        url: "/api/task/gettasklist",
        type: "get",
        contentType: "application/json",
        data: { pageId: pageNumber }
    }).done(function (data) {
        if (data.length > 0) {
            for (i = 0; i < data.length; i++) {
                userTaskMyViewModel.userTaskMyDetailsDTO.push(data[i]);
            }

1 个答案:

答案 0 :(得分:0)

TaskCss添加到项目中,然后将其推送到可观察数组...

function addTaskCss (userTask) {
    userTask.TaskCss = ko.computed(function () {
        return (userTask.Percent === 0) ? "item-red" : "item-green";
    });
}

// ...

$.ajax(/* ... */).done(function (data) {
        if (data.length > 0) {
            for (i = 0; i < data.length; i++) {
                addTaskCss(data[i]);
                userTaskMyViewModel.userTaskMyDetailsDTO.push(data[i]);
            }

如果ajax调用返回了很多项,请考虑推送到底层数组并通知订阅者一次,因为这样更有效...

$.ajax(/* ... */).done(function (data) {
    var userTaskMyDetailArray = userTaskMyViewModel.userTaskMyDetailsDTO();
    if (data.length > 0) {
        for (i = 0; i < data.length; i++) {
            addTaskCss(data[i]);
            userTaskMyDetailArray.push(data[i]);
        }
        userTaskMyViewModel.userTaskMyDetailsDTO.valueHasMutated();

此处有关此技术的更多信息...... http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html