如何定义充满Json数据的knockout viewmodel中的函数

时间:2012-07-05 11:34:40

标签: javascript knockout.js knockout-mapping-plugin

我在viewmodel中定义一个函数时遇到了问题。

我通过jquery getJSON获取json数据并将此数据映射到我的viewmodel。

$.getJSON('/Company/GetCompanies', function(data) { 
    var viewModel = new CompanyViewModel()
    viewModel.model = ko.mapping.fromJS(data)
    ko.applyBindings(viewModel)
});

下面是我的viewmodel。你可以看到我想要做的是,通过名为companyName的函数返回viewmodel的一个属性

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

    self.companyName = function()
         return model.CompanyName; 
    };
}

然后我想使用像<span data-bind="text: companyName" />这样的函数但是,JavaScript函数不会被评估并作为文本返回。

我在网上浏览了Knockout的例子,但所有这些都使用了计算的可观察量。

有没有办法实现这个目标?感谢。

2 个答案:

答案 0 :(得分:4)

试试这个:

var CompanyViewModel = function(data) {
    ko.mapping.fromJS(data, {}, this); 
};

CompanyViewModel.prototype.fileTaxes = function() {
    console.log("Company is filing taxes.");
};

$.getJSON('/Company/GetCompanies', function(data) { 

    // data would look something like this: 
    // data: { companyName : "MicroStrategy",
    //         founderName : "etc" }
    var viewModel = new CompanyViewModel(data);
    ko.applyBindings(viewModel)
});

答案 1 :(得分:1)

我做了一些测试,这对我有用:

return self.model()[0].CompanyName;

并使用:data-bind="text: companyName()"

进行调用

编辑:

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

            self.companyName = function(){

                 return self.model()[0].CompanyName; 
            };
        }

        $.getJSON('/Company/GetCompanies', function(data) { 
            var viewModel = new CompanyViewModel();
            viewModel.model = ko.mapping.fromJS(data);
            ko.applyBindings(viewModel);
        });

这可以假设您的JSON数据以如下格式返回:

[{"CompanyName":"Stack","SomeOtherField":"SomeOtherValue"},...];

并且你里面只有一家公司。