4

我正在尝试使用 jQuery 将“ data-bind ”属性添加到 div,如下所示:

var messageViewModel = {
    data: ko.observable({   
        message: response.message, 
        sendDateFmted: response.sendDateFmted, 
        messageId: response.messageId
    })
     };

$("<div>",{
    class:"messageToAndFromOtherMember"
}).data("bind", "template: { name: 'message-template', data: data }").appendTo("#messagesToAndFromOtherMember");

ko.applyBindings(messageViewModel);

KnockoutJs 需要“数据绑定”。但是我得到的只是这个空的div:

<div class="messageToAndFromOtherMember"></div>

请注意,没有这样data-bind的属性,因此 div 保持为空......

4

2 回答 2

8

jQuery.data()将值存储在内存中并使用data-*属性进行初始化。您可能希望通过在元素创建时设置它来坚持。

$("<div/>", {
  class: "messageToAndFromOtherMember",
  "data-bind": "template: { name: 'message-template', data: data }"
}).appendTo("#messageToAndFromOtherMember");
于 2012-12-02T20:26:29.017 回答
2

从一般意义上讲,亚历山大的回答绝对是正确的,但我不禁注意到,在您的具体示例中,您似乎通过为每条消息创建新的绑定范围来将消息添加到代码中。如果是这种情况,我认为您错误地使用了 Knockout(如果没有,请告诉我,我将删除它)。

如果您从服务器获取新消息,并且只是尝试在页面上显示它们的列表,那么更好的结构是使用ObservableArray,然后简单地将新消息推送到它。标准的敲除绑定会自动将新消息添加到您的 html 中,而无需创建新的绑定范围,以及为新消息创建一个完全独立的视图模型。您可以在这个 fiddle中看到这一点。

这是相当做作的 ViewModel:

var ViewModel = function(data) {
    var self = this;
    self.messages = ko.observableArray();
    self.newMessage = ko.observable('');
    self.addMessage = function() {
        var message = new Message({ message: self.newMessage()});
        self.newMessage('');
        self.messages.push(message);
    };
};
于 2012-12-03T00:29:26.440 回答