2016-10-22 168 views
2

我有一个JS对象:Knockout.js与映射对象绑定和订阅属性更改

var bookmark = { 
    id: 'id', 
    description: 'description', 
    notes: 'notes' 
} 

我要绑定到整个对象,在一个textarea显示注释,并且订阅修改笔记。

这是我到目前为止有:

this.bookmark = ko.observable(); 

this.bookmark.subscribe = function(bookmarkWithNewNotes) { 
    //use the bookmarkWithNewNotes.id to update the bookmark in the db 
} 

我设置书签,像这样:

this.bookmark(ko.mapping.fromJS(existingBookmark)); 

的看法是这样的:

<div databind="with: $root.bookmark" > 
    Notes 
    <textarea class="userNotes" rows="10" data-bind="value: notes" ></textarea> 
    </div> 

这ISN”不工作。我需要做些什么才能按照我希望的方式工作?

谢谢!

+0

请使用Stack Snippets('<>'工具栏按钮)使用** runnable ** [mcve]更新您的问题,以便我们可以在上下文中轻松查看问题并帮助您解决问题。 –

+0

我只是试图和我不能让外部映射文件正常工作。很累。我会在早上再试一次。 – MayNotBe

+0

顺便说一句,它的数据绑定=“”不databind =“” – Joonas89

回答

0

以下是Fiddle中的示例。

你可以做这样的事情:

<div> 
    Notes 
    <div data-bind="foreach: bookmarks"> 
     <textarea rows="10" data-bind="value: note"></textarea> 
    </div> 
</div> 

,并为你的书签创建视图模型,就像这样:

function BookmarkViewModel(id, description, note) { 
    var self = this; 

    self.id = id; 
    self.description = ko.observable(description); 
    self.note = ko.observable(note); 

    self.note.subscribe(function(val) { 
     alert("Save note, id: " + self.id + ", description: " + self.description() + ", note: " + self.note()); 
    }); 

    return self; 
} 

得到您的数据后,为每个项目创建虚拟机,像这样:

function AppViewModel(data) { 
    var self = this; 

    self.bookmarks = ko.observableArray(); 

    for (var i = 0; i < data.length; i++) { 
     self.bookmarks().push(new BookmarkViewModel(data[i].id, data[i].description, data[i].note)); 
    }; 

    return self; 
} 

可以CRE吃了一个单独的服务来获取你的数据,我只是嘲笑了这个poc。

$(function() { 

    var data = [{ 
     id: 1, 
     description: 'some description', 
     note: 'some note' 
    }, { 
     id: 2, 
     description: 'some other description', 
     note: 'some other note' 
    }]; 

    ko.applyBindings(new AppViewModel(data)); 
}); 
+1

谢谢。这让我走上了正轨,并且我能够实施一个工作解决方案。 – MayNotBe