【问题标题】:knockoutjs kogrid display date within cell - with plunkknockoutjs kogrid 在单元格内显示日期 - 带有 plunk
【发布时间】:2016-09-20 08:03:55
【问题描述】:

我有以下 columnDefs

self.columnDefs = [
        { width: 150, field: 'timeReceived', displayName: 'Time Received', cellFilter: function (data) { return moment(data).format('DD/MM/YYYY h:mm a') } },
        { width: 500, field: 'name', displayName: 'Name' },
        { width: 150, field: 'LinkToTimeSent', displayName: 'Time SentX', cellTemplate: '<a data-bind="text:$parent.entity.timeSent, attr: { href: $parent.entity.linkToTimeSent}" ></a>' },
    ];

我的问题在于 Time SentX。我希望它显示 entity.timeSent 的内容,但使用时刻库​​转换为人类消费。

如何从我的 columnDefs 中调用函数 moment($parent.entity.timeSent).format('DD/MM/YYYY h:mm a')?

在下面的 plunk 中,第 96 行需要包含类似

text:moment($parent.entity.TimeSent, "DD/MM/YYYY h:mm a") but I can't get it to work!

:https://plnkr.co/edit/jNn3knbnCCbBQu9NgKze?p=preview

【问题讨论】:

  • 在您的问题中使用 cellFilter 有什么问题:{ field: 'TimeSent', displayName: 'TimeSent', width: 130, cellFilter: function (data) { return moment(data).format('DD/MM/YYYY h:mm a')} }, 工作正常:plnkr.co/edit/sqNyTmm4ZisVg1CzVSIt?p=preview
  • 嗨@nemesv,我希望单元格中的文本成为超链接。因此,它应该显示发送的时间,但是当用户单击它时,导航到已发送消息的副本。这就是为什么我使用 cellTemplate 而不是 cellFilter

标签: javascript knockout.js kogrid


【解决方案1】:

编辑:我的回答有点太笼统了。尝试更具体。

将您的WorkflowRules 映射到他们自己的“视图模型”,您可以做任何您喜欢的事情:

this.workflowRules = ko.observableArray(sampleData.WorkflowRules
  .map(function(jsonRule) {

    // Add UI helpers (create a sort of viewmodel)
    var timeSentMoment  = moment(jsonRule.TimeSent);

    // Purely for display purposes:
    jsonRule.timeSentLabel = timeSentMoment.format('DD/MM/YYYY h:mm a');
    // Do what ever you want to create the right url
    jsonRule.href = jsonRule.TimeSent; 

    return jsonRule;
}));

然后,在您的模板中:

<div data-bind="with: $parent.entity">
  <a data-bind="text: timeSentLabel, 
                attr: {href: href}"></a>
</div>';    

js中定义的:

var timeSentTemplate = '<div data-bind="with: $parent.entity"><a data-bind="text: timeSentLabel, attr: {href: href}"></a></div>';

var columnDefs = [
  { cellTemplate: timeSentTemplate, /* etc. */ }
];

我希望我终于正确地回答了你的问题......

https://plnkr.co/edit/93ucvDLk5bUFtU4dB1vn?p=preview,移动了一些东西)


上一个更一般的答案:

当您创建敲除绑定时,敲除会自动将绑定的第二部分包装在一个函数中。例如:

data-bind="text: myTextObservable"

被处理为:

text: function (){ return myTextObservable }

另外,knockout 使用这个函数来创建一个computedObservable。这将创建对函数内使用的任何 observable 的订阅,确保在其中任何一个发生更改时重新评估数据绑定。

这意味着在您的情况下,您可以像这样在数据绑定中定义格式规则(假设 timeSent 是可观察的`):

data-bind="text: moment($parent.entity.timeSent()).format('DD/MM/YYYY h:mm a') "

Knockout 将看到 timeSent observable 被调用,并确保整个绑定得到正确更新。这是一个例子:

var date = ko.observable(new Date());
var addDay = function() {
  date(moment(date())
    .add(1, "day")
    .toDate()
  );
};

ko.applyBindings({
  date: date,
  addDay: addDay
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<strong>The "raw" observable</strong>
<div data-bind="text: date"></div>
<br/>
<strong>A "computed" text defined in the data-bind</strong>
<div data-bind="text: moment(date()).format('DD-MM-YY')"></div>
<button data-bind="click:addDay">add a day</button>

然而,我的建议是在您的视图模型中创建一个单独的计算 observable。毕竟,这就是视图模型的本意,它会在修复错误时为您提供很大帮助。即:

// Add to your entity view model:
this.timeSentLabel = ko.computed(function() {
  return moment(this.timeSent())
    .format('DD/MM/YYYY h:mm a');
}, this);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多