【问题标题】:How to replace ' / ' with '-' inside ObservableArray ? Knockout js如何在 ObservableArray 中将 '/' 替换为 '-' ?淘汰赛js
【发布时间】:2014-07-25 06:28:11
【问题描述】:

好吧,我试图通过 ajax 调用将一个可观察数组传递给我的控制器,但我得到了除 date 之外的所有值。我得到类似'01-01-01'等的东西。

我发现了问题但无法解决,因为我不知道如何将 / 替换为 - 。

我的 ObservableArray 有大约 10 个列表项,每个列表项包含许多属性,其中 startDate 包含日期,如 ("23/10/2014") 。我只需要("23-10-2014") 之类的东西。

想张贴我的功能和更多我希望在这种情况下不需要我相信。

让我用一些代码和示例数据来解释一下:

function myarray()
{
var self=this;
self.startDate=ko.observable("");
self.name=ko.observable("");
self.place=ko.observable("");
}

MyObservableArray:

self.Main= ko.observableArray();

在这期间我做了一些事情来将数据加载到self.Main 中,并且我将 self.Main 发送到具有如下数据的控制器:

self.Main[0] holds : 

startDate() -->gives you  "23/10/2014" //individual observables inside onservable array
name() --> "jhon"
place()--> "croatia"

可能

self.Main[9] holds :
startDate() --> "29/05/2012" 
    name() --> "pop"
    place()--> "usa"

我想改变 self.Main() 并替换 startDate 并使用相同的 self.Main 发送到我的控制器。在self.Main 替换后,当我检查日期时,/ 应替换为-。

可能的解决方案:我可以使用不同的可观察数组并将Main 的所有VM 推入其中,但我试图在self.Main 上做而不使用其他。

如果有人可以显示一些光,非常感谢。

【问题讨论】:

  • 出了什么问题,你尝试了什么?
  • @Mritunjay 我不熟悉淘汰赛,因为我只知道 jquery 中的replacewith 对我的情况没有帮助。
  • 你试过像“23-10-2014”这样发送日期吗?
  • 你为什么不能尝试我在答案中添加的简单 JS。
  • Akhlesh 是的,我正在尝试。我不知道如何改变 observableArray 中的 observable 。

标签: javascript knockout.js


【解决方案1】:

我知道您在替换中转义 / 时遇到问题。

试试这个

"(23/10/2014)".replace(/\//g,"-") //returns "(23-10-2014)"

我用简单的 JS 为你尝试了一些东西

var arr = [{date:"(23/10/2014)"},{date:"(23/10/2014)"},{date:"(23/10/2014)"},{date:"(23/10/2014)"}];

arr.forEach(function(obj){obj.date = obj.date.replace(/\//g,"-")});

console.log(arr) //will print date field as "(23-10-2014)" for all objects.

【讨论】:

  • 是的,关键是如何在 observableArray 中的每个可观察对象中进行替换
  • @supercool 我不熟悉knout,你不能用each这样的数组函数吗?
  • 你会为每个循环做一个。对于每个 x 作为数组名称并将替换 js 放在循环中。
  • 我与ko.utils.arrayForEach合作过,让我检查一下并告诉你
  • 此解决方案将替换值,但考虑到他使用的是 knockout.js,这只是解决方案的一部分。
【解决方案2】:

一种解决方案是添加一个computed 值,该值返回具有正确值的数组。

self.Main = ko.observableArray([...values here...]);

self.MainComputed = ko.computed(function() { 
  var computedArray = [];

  self.Main().forEach(function(item) {
    var newItem = myarray(); //Create a new item.
    newItem.name(item.name());
    newItem.place(item.place());
    newItem.startDate(item.startDate().replace(/\//g,"-"));
    computedArray.push(newItem);
  });

  return computedArray;
});

然后在需要-的地方使用计算值。


考虑到您想使用self.Main时,我可以想到另外两种方法来解决您的问题:

  1. 在您的项目上设置startDate 之前,将/ 替换为-。
  2. 将startDate 更改为计算值,同时将原始值存储在另一个变量中。

第一个解决方案应该非常简单(前提是它是一个有效的解决方案)。

第二种解决方案如下所示:

function myarray()
{
  var self=this;
  self.originalStartDate = ko.observable("");
  self.name = ko.observable("");
  self.place = ko.observable("");

  self.startDate = ko.computed(function() {
    if(self.originalStartDate()) {
      //We can only replace if the value is set.
      return self.originalStartDate().replace(/\//g,"-");
    }
    else {
      //If replace was not possible, we return the value as is.
      return self.originalStartDate();
    }
  });
}

现在,当您设置值时,您可以执行以下操作:

var item = myarray();
item.originalStartDate = "01/01/2014";

那么当你得到startDate 的值时,你会得到"01-01-2014"。

【讨论】:

  • 更新了我的代码可能会清除一些东西 :) 我喜欢计算的东西。
  • 我已根据您添加的代码更新了我的答案。我仍然相信使用computed 是要走的路。这样您的数据将始终保持同步。
  • 我添加了一些其他建议,您可以考虑作为解决方案。
  • 其实我一直在尝试更改self.Main,而不是在第一次加载时执行初始Get beoz 我使用计算将我的格式从12-12-2012 更改为12/12/ 2012 年。后来我必须转换回来,但现在这是一个棘手的情况。
【解决方案3】:

我没有使用过 Knockout.js,但您可以使用 Javascript 替换来做到这一点:

var str = [your array value] ;
var res = str.replace("/", "-");

更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2013-02-28
    相关资源
    最近更新 更多