C# 在敲除中使用JSON时计算的可观察值

C# 在敲除中使用JSON时计算的可观察值,c#,knockout.js,C#,Knockout.js,我在寻求一些令人震惊的建议。我已经发布了这个问题,但我的理解已经改变,所以我重新发布 我有以下代码: function updateViewModel() { if (typeof groupId == 'undefined') { groupId = getDefaultGroupId(); } $.getJSON("api/livestatusgroup/children/" + groupId) .done(function (da

我在寻求一些令人震惊的建议。我已经发布了这个问题,但我的理解已经改变,所以我重新发布

我有以下代码:

function updateViewModel() {
    if (typeof groupId == 'undefined') {
        groupId = getDefaultGroupId();
    }

    $.getJSON("api/livestatusgroup/children/" + groupId)
        .done(function (data) {
            ko.mapping.fromJS(data, liveStatusViewModel.groups);
            groupsLoaded();
        });

    $.getJSON("api/livestatusgroup/resources/" + groupId)
        .done(function(data) {
            ko.mapping.fromJS(data, liveStatusViewModel.resources);
            resourcesLoaded();
        });

    this.resourceImagePath = ko.computed(function () {
        return "../Image/" + this.resourceID();
    }, this);
}


function ViewModel() {
    var self = this;
    self.resources = ko.mapping.fromJS([]);
    self.groups = ko.mapping.fromJS([]);
}
正如您所看到的,我正在使用JSON加载视图模型,但是resourceID()方法有问题。我不确定如何编写将this.resourceID()替换为资源ID(例如,../Image/1)的方法。我尝试过使用这样的计算观察者:

    liveStatusViewModel.resources.resourceID() = ko.computed(function() {
        return this.ResID;
    }, liveStatusViewModel);
    function resourceImagePath(resourceId) {
        return "/Images/" + resourceId;
    }
    function resourceImagePath(resourceId) {
        return "/Images/1";
    }
…但那没用。有人能帮我吗?我已经浏览了整个互联网,包括堆栈溢出,但没有运气。这真是个绊脚石

进一步工作

我刚刚尝试更改将/Image/xx附加到Image src的方式,如下所示:

    liveStatusViewModel.resources.resourceID() = ko.computed(function() {
        return this.ResID;
    }, liveStatusViewModel);
    function resourceImagePath(resourceId) {
        return "/Images/" + resourceId;
    }
    function resourceImagePath(resourceId) {
        return "/Images/1";
    }
使用以下HTML标记

<div class="icon" id="resourceIcon" runat="server"><img data-bind="attr: { src: resourceImagePath(ResourceId) }" alt=""/></div>
使用硬编码的图像id进行测试,效果绝对良好

理想情况下,我想知道如何使JSON中的资源ID可见

有人有其他想法吗


谢谢,Mark

我认为您的结构不正确,因为计算出的函数“resourceImagePath”应该是单个资源的定义

我意识到你可能想使用这个映射插件,但根据我的经验,我发现当我手动映射时,我有更多的灵活性。这并不有趣,但你只要做一次就可以继续前进

以下是我将如何处理这个问题。我根本没有测试过

  • 定义视图模型(“资源”、“组”、“视图模型”; 包括计算变量)

  • 调用viewModel。在加载文档时初始化函数

  • 通过JSON结果(即“数据”)初始化循环时,调用以收集数据和
    创建Javascript对象的新实例(即“资源”、“组”)

    //全局变量
    var-groupId;
    //定义视图模型
    var resource=函数(resourceID){
    var self=这个;
    self.resourceID()=ko.observable(resourceID);
    self.resourceMagePath=ko.computed(函数(){
    返回“./Image/”+self.resourceID();
    },自我);
    }
    //定义组
    var group=函数(groupId){
    var self=这个;
    self.groupID()=ko.observable(groupID);
    }
    var viewModel=函数(){
    var self=这个;
    self.resources=ko.observearray([]);
    self.groups=ko.observearray([]);
    self.Initialize=函数(){
    if(typeof groupId==“未定义”){
    groupId=getDefaultGroupId();
    }
    $.getJSON(“api/livestatusgroup/children/”+groupId)
    .完成(功能(数据){
    对于(变量i=0,j=data.length;i

  • 乍一看,我发现了几个潜在的问题

    <img data-bind="attr: { src: resourceImagePath(ResourceId) }" />
    
    在这里,您在resourceID上添加了paranthesis,它尝试解析函数,同时也尝试在表达式的右侧赋值。这不是有效的JavaScript。删除括号后,它应该可以工作

    liveStatusViewModel.resources.resourceID = ko.computed(function() {
        return this.ResID;
    }, liveStatusViewModel);
    

    至于你文章的其余部分,我不太明白你想做什么,所以这是我能给出的最好答案。我不确定是否要将resourceID分配给liveStatusViewModel.resources上的每个资源,或者是否要添加一个在liveStatusViewModel.resources对象上计算的资源。如果你澄清,我将能够进一步回答

    我在你之前的问题中问过,并且会再次问:你能给我们看一下模型的完整代码,包含ResID,以及你调用
    updateViewModel()
    的代码吗。顺便问一下,如果您的
    resourceID()
    是在liveStatusViewModel中声明的,为什么您希望它可以像这样访问
    updateViewModel
    函数中的.resourceID()?我没有模型的代码,它是使用JSON填充的。我从$(document).ready函数调用updateViewModel()。
    liveStatusViewModel.resources.resourceID = ko.computed(function() {
        return this.ResID;
    }, liveStatusViewModel);