从html5 websocket在viewModel knockoutjs中设置数据

从html5 websocket在viewModel knockoutjs中设置数据,html,knockout.js,websocket,requirejs,Html,Knockout.js,Websocket,Requirejs,我正在尝试创建knockout.js组件,该组件从HTML5WebSocket获取数据。Websocket代码在单独的脚本中,例如util.js。我能够连接套接字并从中获取数据,但不知道如何在组件的ViewModel中正确设置相应的属性 Websocket-util.js: var options = { server: '127.0.0.1', port: '12345' }; var socket, loadedFlag; var timeout = 2000;

我正在尝试创建knockout.js组件,该组件从HTML5WebSocket获取数据。Websocket代码在单独的脚本中,例如util.js。我能够连接套接字并从中获取数据,但不知道如何在组件的ViewModel中正确设置相应的属性

Websocket-util.js:

     var options = {
    server: '127.0.0.1',
    port: '12345'
};

var socket, loadedFlag;
var timeout = 2000;
var clearTimer = -1;
var data = {};

function handleErrors(sError, sURL, iLine)
{
    return true;
};
function getSocketState()
{
    return (socket != null) ? socket.readyState : 0;
}

function onMessage(e)
{
    data=$.parseJSON(e.data);

 // ???? Is it possible to have here something like
 // ???? viewModel.getDataWS1(data);
}

function onError()
{
    clearInterval(clearTimer);
    socket.onclose = function () {
        loadedFlag = false;
    };
    clearTimer = setInterval("connectWebSocket()", timeout);
}

function onClose()
{
    loadedFlag = false;
    clearInterval(clearTimer);
    clearTimer = setInterval("connectWebSocket()", timeout);
}

function onOpen()
{
    clearInterval(clearTimer);
    console.log("open" + getSocketState());
}

function connectWebSocket()
{

    if ("WebSocket" in window)
    {
        if (getSocketState() === 1)
        {
            socket.onopen = onOpen;
            clearInterval(clearTimer);
            console.log(getSocketState());
        }
        else
        {
            try
            {
                host = "ws://" + options.server + ":" + options.port;
                socket = new WebSocket(host);
                socket.onopen = onOpen;
                socket.onmessage = function (e) {
                    onMessage(e);
                };
                socket.onerror = onError;
                socket.onclose = onClose;
            }
            catch (exeption)
            {
                console.log(exeption);
            }
        }
    }
}
组件(productDisplay.js)-创建可在多个页面上使用的组件:

define([
    'jquery',
    'app/models/productDisplayModel',
    'knockout',
    'mapping',
    'socket'
],
        function ($, model, ko, mapping) {
            ko.components.register('product', {
                viewModel: {require: 'app/models/productModel'},
                template: {require: 'text!app/views/product.html'}
            });

        });
Product ViewModel(productModel.js)-我很难将ViewModel属性设置为websocket中的数据:

var viewModel = {};

define(['knockout', 'mapping', 'jquery'], function (ko, mapping, $) {

    function Product(name, rating) {
        this.name = name;
        this.userRating = ko.observable(rating || null);
    }

    function MyViewModel() {
        this.products = ko.observableArray(); // Start empty
    }

    MyViewModel.prototype.getDataWS1 = function () {

     //Websocket has not connected and returned data yet, so data object is empty
     // ???? Is there anyway I can add something like promise so that the value is set once socket is connected? 
        this.products(data);
    };

// apply binding on page load
    $(document).ready(function () {
        connectToServer1();
        viewModel = new MyViewModel();

        ko.applyBindings(viewModel);
        viewModel.getDataWS1();
    });

});

感谢您的建议。

当您收到以下方式的消息时,您可以更新一个可观察到的内容:

util.js

function onMessage(e) {
    var productData = $.parseJSON(e.data);
    viewModel.addNewProduct(productData);
}
function Product(name, rating) {
    this.name = name;
    this.userRating = ko.observable(rating || null);
}

function MyViewModel() {
    this.products = ko.observableArray(); // Start empty
}

MyViewModel.prototype.addNewProduct(product) {
  var newProduct = new Product(product.name, product.rating);
  this.products.push(newProduct);
}
productModel.js

function onMessage(e) {
    var productData = $.parseJSON(e.data);
    viewModel.addNewProduct(productData);
}
function Product(name, rating) {
    this.name = name;
    this.userRating = ko.observable(rating || null);
}

function MyViewModel() {
    this.products = ko.observableArray(); // Start empty
}

MyViewModel.prototype.addNewProduct(product) {
  var newProduct = new Product(product.name, product.rating);
  this.products.push(newProduct);
}

基本上,这个想法是,当您收到消息(在onMessage函数中)时,您将解析数据并调用viewmodel中的函数,以将消息数据添加到viewmodel属性(observables、observableArrays等)

是否可以使用回调?类似于connectToServer1(函数(数据){this.products(数据)});我看不到您在哪里定义了connectToServer1,因此我无法向您演示如何返回回调。