0

简而言之:我需要替换通过淘汰映射插件创建的视图模型中的整个对象。我该怎么做呢?这应该反过来更新绑定到该对象的控件...

更多细节 :

我正在使用带有signalR的淘汰赛。

我能够在页面加载期间从服务器检索 JSON,在使用 ParseJSON 后使用 ko.mapping.FromJSON 或 FromJS 解析它,并在第一次将其加载到视图模型中。

但是,在那之后,我无法使用 SignalR 从服务器更新视图模型。

这是我的视图模型:

  function viewmodel(objServerModel) {
        var self = this;
        self.profile = objServerModel;
        self.devices = ko.observableArray(['one', 'two']);
        self.updateprofile = ko.observable('@Html.Raw(HttpUtility.JavaScriptStringEncode(Test.ReadXmlIntoModel()))')


    }

这是我在运行时用来更新模型的代码..从服务器调用以下函数...

function UpdateVM(modeljson)
{

    var objResult = $.parseJSON(modeljson);
    var objModelFromServer = ko.mapping.fromJS(objResult, {},objModel.profile);
    // var objFinal = objResult.capture.capturevideo.videodevice.Value;
// objModel =  viewmodel(objModelFromServer);
  //  objModel.profile(objModelFromServer);

    viewmodel(objModelFromServer);
    return objModel;
}

调用 UpdateVM 时,此文本框应在运行时更新:

<input id="txt1" data-bind="value: profile.capture.capturevideo.videodevice.Value" type="text" />

请帮忙...

谢谢。

编辑:请注意,它不是一个字符串。这是一个使用knockout的映射插件创建的对象。我需要用映射插件创建的具有不同值的相同结构的另一个对象替换现有对象

4

1 回答 1

1

您尝试更新的属性不是可观察的属性,因此更新它不会更新 UI。我不确定您的配置文件对象是什么样的,但它需要有一些可观察的属性。例如 :

function viewmodel()
{
    var self = this;
    self.profile = new profile();
}
function profile() {
    var self = this;
    self.foobar = ko.observable(1);
    self.barfoo = ko.observable("hello");
}

现在在您的UpdateVM()函数中,您只需要更新配置文件对象的属性。

function UpdateVM(modeljson)
{
    var objResult = $.parseJSON(modeljson);
    viewmodel.profile.foobar(objResult.foobar);
    viewmodel.profile.barfoo(objResult.barfoo);
}

这应该会导致您的 UI 更新。

于 2013-06-10T17:07:13.207 回答