外部更新淘汰JS viewmodel

时间:2013-06-10 16:19:49

标签: jquery knockout.js viewmodel signalr

简介:我需要在通过knockout映射插件创建的viewmodel中替换整个对象。我该怎么做呢?这应该反过来更新绑定到对象 ...

的控件

更多详情:

我正在使用signalR进行淘汰赛。

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

但是,之后,我无法使用SignalR从服务器更新viewmodel。

这是我的观点模型:

  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的映射插件创建的对象。我需要用映射插件创建的不同值的另一个具有相同结构的对象替换现有对象

1 个答案:

答案 0 :(得分: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更新。