0

首先對不起我的英文不好!用戶界面不會完全用KnockoutJS和JqueryUI更新可排序

無論如何,我想基於Knockout JS和JQuery UI做一個簡單的任務管理器。 經過一番研究,我發現了一個小插件,幫助KO與jQueryUI的的排序進行連接,你可以在這裏讀到它:http://www.knockmeout.net/2012/02/revisiting-dragging-dropping-and.html

插件效果很好更新觀察到陣列的順序,但我也需要更新一些值基於它們在陣列中的位置的元素。我試圖在每次排序後更新整個數組,我注意到一個奇怪的行爲:雖然UI保持不變,但如果將數組發送到JSON,它將使用正確的值進行更新!

你可以找到我的代碼在這裏的一個片段:http://jsfiddle.net/ingro/mz3MK/

嘗試移動了一些要素的排序列表,然後看到用戶界面,並與「打印」按鈕顯示的值之間的差異。

編輯:嘗試將第一個元素(測試#1)拉到可排序列表的底部。元素的屬性'時間'保持不變(07:00)。現在把它帶到可排序列表的第二個地方,你注意到'時間'這個屬性變成了「10:00」!事實上,只有在拖動某個東西時纔會刷新UI,並且只有被拖動的元素纔會刷新到拖動前的狀態。但是,如果您打印陣列的值,則可以看到總是刷新:\

感謝任何能夠幫助我的人!

+0

我有點困惑。小提琴的印刷品與用戶界面相匹配。這兩個數字不會重新排列,是你想要發生什麼? – Tyrsius

+0

對不起,也許我沒有解釋得很好。嘗試將第一個元素(測試#1)拖到可排序列表的底部。元素的屬性'時間'保持不變(07:00)。現在把它帶到可排序列表的第二個地方,你注意到'時間'這個屬性變成了「10:00」!事實上,只有在拖動某個東西時纔會刷新UI,並且只有被拖動的元素纔會刷新到拖動前的狀態。但是,如果您打印數組的值,則可以看到總是刷新:\ – Ingro

回答

2

正如我所理解的問題,你需要使時間和標題可觀察。 請考慮更新jsfiddle

var Post = function(time, title) { 
    this.time = ko.observable(time); 
    this.title = ko.observable(title); 
}; 

然後

self.posts = ko.observableArray(ko.utils.arrayMap(posts , function(post) { 
     return new Post(post.time, post.title); 
})); 

,然後你就可以使用觀察到更新語法:

post.time(self.times()[count]); 

您也可以找到有用的這個淘汰賽待辦事項應用例如TodoApp

+0

+1用於指出ArrayMap以及一個全方位的更多OO格式。 –

+0

謝謝你的男人!你的回答非常有幫助! :D – Ingro

2

你需要使時間p roperty在帖子觀察到,並改變你更新,如this fiddle方式:

前:

self.posts = ko.observableArray([ 
    {time: "07:00", title: "test#1"}, 
    {time: "08:00", title: "work#2"},  
    {time: "09:00", title: "task#3"},  
    {time: "10:00", title: "sleep#4"} 
]); 

。 。

post.time = self.times()[count]; 

後:

self.posts = ko.observableArray([ 
    {time: ko.observable("07:00"), title: "test#1"}, 
    {time: ko.observable("08:00"), title: "work#2"},  
    {time: ko.observable("09:00"), title: "task#3"},  
    {time: ko.observable("10:00"), title: "sleep#4"} 
]); 

。 。

post.time(self.times()[count]); 

原因是由於該屬性是不可觀察的,因此要顯示的文本的綁定將僅評估一次。

+0

也謝謝你的回答! :d – Ingro