将JSON值添加到viewmodel中的ko.computed

将JSON值添加到viewmodel中的ko.computed,json,knockout.js,Json,Knockout.js,我正忙着为我的web应用程序创建货币模块,我正在使用Yahoo Finance API返回我在本地数据库中定义的2种货币的货币兑换率。我从API获得了JSON数据,我只想使用ko.computed将我从Finance API收到的JSON数据绑定到我现有的Viewmodel。我不确定我是否应该使用ko.computed来实现这一点,所以任何建议都会大有帮助 这是我的密码: var currency = function (data) { var self = this;

我正忙着为我的web应用程序创建货币模块,我正在使用Yahoo Finance API返回我在本地数据库中定义的2种货币的货币兑换率。我从API获得了JSON数据,我只想使用ko.computed将我从Finance API收到的JSON数据绑定到我现有的Viewmodel。我不确定我是否应该使用ko.computed来实现这一点,所以任何建议都会大有帮助

这是我的密码:

    var currency = function (data) {
        var self = this;
        self.CurrencyFrom = ko.observable(data.CurrencyFrom);
        self.CurrencyTo = ko.observable(data.CurrencyTo);
        self.ConversionRate = ko.computed(rates); // I WANT TO BIND THE VALUE FROM API HERE
    }

    var CurrencyModel = function (Currencies) {
        var self = this;
        self.Currencies = ko.observableArray(Currencies);

        self.AddCurrency = function () {
            self.Currencies.push({
                CurrencyFrom: "",
                CurrencyTo: "",
                ConversionRate: ""
            });
        };

        self.RemoveCurrency = function (Currency) {
            self.Currencies.remove(Currency);
        };

        self.Save = function (Form) {
            alert("Could Now Save: " + ko.utils.stringifyJson(self.Currencies));
        };

        $.ajax({
            url: "CurrencyConfiguration.aspx/GetConfiguredCurrencies",
            // Current Page, Method  
            data: '{}',
            // parameter map as JSON  
            type: "POST",
            // data has to be POSTed  
            contentType: "application/json; charset=utf-8",
            // posting JSON content      
            dataType: "JSON",
            // type of data is JSON (must be upper case!)  
            timeout: 10000,
            // AJAX timeout  
            success: function (Result) {
                var MappedCurrencies =
              $.map(Result.d,
       function (item) {
           getRate(item.CurrencyFrom, item.CurrencyTo);

           return new currency(item);
       }
       );
                self.Currencies(MappedCurrencies);

            },
            error: function (xhr, status) {
                alert(status + " - " + xhr.responseText);
            }
        });
    };

    //3rd Party JSON result from Yahoo Finance API
    function getRate(from, to) {
        var script = document.createElement('script');
        script.setAttribute('src', "http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D" + from + to + "%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&callback=rates"); //HERE I CALL THE VALUE TO OBTAIN THE CONVERSION RATE FROM API
        document.body.appendChild(script);
    }


    //I WANT TO ADD THIS TO MY VIEWMODEL
    var rates = function parseExchangeRate(YahooData) {
                var rate = YahooData.query.results.row.rate;
        }


    $(document).ready(function () {
        var VM = new CurrencyModel();
        ko.applyBindings(VM);
        $('[rel=tooltip]').tooltip();
    })
parseExchangeRate函数返回的JSON(Yahoo查询结果):


我看到您已经在使用jquery,所以我也将jquery用于JSONP。我使用了一个简单的ko.observable作为转换率,并添加了一个“裸”的ko.computed,它执行ajax请求并异步更新observable。如果您需要进一步的澄清,请告诉我

JSFIDLE示例(使用模拟数据而不是初始ajax):

更新代码:

var currency = function (data) {
  var self = this;
  self.CurrencyFrom = ko.observable(data.CurrencyFrom);
  self.CurrencyTo = ko.observable(data.CurrencyTo);
  self.ConversionRate = ko.observable(data.ConversionRate);

  ko.computed(function () {
    var from = self.CurrencyFrom(),
      to = self.CurrencyTo();

    if (!from || !to) {
      self.ConversionRate("N/A");
      return;
    }

    getRate(from, to).done(function (YahooData) {
      console.log("got yahoo data for [" + from + "," + to + "]: ", YahooData);
      self.ConversionRate(YahooData.query.results.row.rate);
    });
  });
}

var CurrencyModel = function (Currencies) {
  var self = this;
  self.Currencies = ko.observableArray(Currencies);

  self.AddCurrency = function () {
    self.Currencies.push(new currency({
      CurrencyFrom: "",
      CurrencyTo: "",
      ConversionRate: ""
    }));
  };

  self.RemoveCurrency = function (Currency) {
    self.Currencies.remove(Currency);
  };

  self.Save = function (Form) {
    alert("Could Now Save: " + ko.utils.stringifyJson(self.Currencies));
  };

  $.ajax({
    url: "CurrencyConfiguration.aspx/GetConfiguredCurrencies",
    // Current Page, Method  
    data: '{}',
    // parameter map as JSON  
    type: "POST",
    // data has to be POSTed  
    contentType: "application/json; charset=utf-8",
    // posting JSON content      
    dataType: "JSON",
    // type of data is JSON (must be upper case!)  
    timeout: 10000,
    // AJAX timeout  
    success: function (Result) {
      var MappedCurrencies = $.map(Result.d,

      function (item) {
        return new currency(item);
      });
      self.Currencies(MappedCurrencies);
    },
    error: function (xhr, status) {
      alert(status + " - " + xhr.responseText);
    }
  });

};

//3rd Party JSON result from Yahoo Finance API
function getRate(from, to) {
  return $.getJSON("http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D" + from + to + "%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&callback=?");
}

先生,您是一位绅士和学者!
var currency = function (data) {
  var self = this;
  self.CurrencyFrom = ko.observable(data.CurrencyFrom);
  self.CurrencyTo = ko.observable(data.CurrencyTo);
  self.ConversionRate = ko.observable(data.ConversionRate);

  ko.computed(function () {
    var from = self.CurrencyFrom(),
      to = self.CurrencyTo();

    if (!from || !to) {
      self.ConversionRate("N/A");
      return;
    }

    getRate(from, to).done(function (YahooData) {
      console.log("got yahoo data for [" + from + "," + to + "]: ", YahooData);
      self.ConversionRate(YahooData.query.results.row.rate);
    });
  });
}

var CurrencyModel = function (Currencies) {
  var self = this;
  self.Currencies = ko.observableArray(Currencies);

  self.AddCurrency = function () {
    self.Currencies.push(new currency({
      CurrencyFrom: "",
      CurrencyTo: "",
      ConversionRate: ""
    }));
  };

  self.RemoveCurrency = function (Currency) {
    self.Currencies.remove(Currency);
  };

  self.Save = function (Form) {
    alert("Could Now Save: " + ko.utils.stringifyJson(self.Currencies));
  };

  $.ajax({
    url: "CurrencyConfiguration.aspx/GetConfiguredCurrencies",
    // Current Page, Method  
    data: '{}',
    // parameter map as JSON  
    type: "POST",
    // data has to be POSTed  
    contentType: "application/json; charset=utf-8",
    // posting JSON content      
    dataType: "JSON",
    // type of data is JSON (must be upper case!)  
    timeout: 10000,
    // AJAX timeout  
    success: function (Result) {
      var MappedCurrencies = $.map(Result.d,

      function (item) {
        return new currency(item);
      });
      self.Currencies(MappedCurrencies);
    },
    error: function (xhr, status) {
      alert(status + " - " + xhr.responseText);
    }
  });

};

//3rd Party JSON result from Yahoo Finance API
function getRate(from, to) {
  return $.getJSON("http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D" + from + to + "%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&callback=?");
}