我在Knockout.js及其映射插件中遇到了一些問題。基本上我想從沒有數據開始,然後在頁面加載時發出Ajax請求來加載信息。我知道Ajax請求正在按預期工作,因爲我在返回時將數據記錄到控制檯。使用映射插件時Knockout.js可觀察陣列未從服務器更新
var projectId = @Model.Project.Id;
var stories;
viewModel = ko.mapping.fromJS(stories);
$.ajax({
type: "GET",
url: "/Projects/JsonDetails",
data: {id: projectId},
success: function (data) {
stories = data.stories;
ko.mapping.fromJS(stories, viewModel);
console.log(stories);
}
});
控制檯正確記錄數據。所以我知道Ajax請求正常工作。
升
查看標記:
<section id="project-stories" data-bind="foreach: stories">
<div class="project-story-container drop-shadow">
<div class="story-summary">
Story Summary
</div>
<div class="story" data-bind="attr:{'data-id': Id}">
As a <span class="actor" data-bind="text: Actor"> </span> I want to <span class="objective" data-bind="text: Objective"> </span>, so that <span class="justification" data-bind="text: Justification"></span>.
</div>
<div class="story-controls">
<a href="#">Edit</a>
</div>
</div>
</section>
我甚至試過打電話:
var projectId = @Model.Project.Id;
var stories;
viewModel = ko.mapping.fromJS(stories);
ko.applyBindings(viewModel);
$.ajax({
type: "GET",
url: "/Projects/JsonDetails",
data: {id: projectId},
success: function (data) {
stories = data.stories;
ko.mapping.fromJS(stories, viewModel);
console.log(stories);
}
});
但是,這只是使它原因更糟KO抱怨的綁定不建立。
任何人都可以看到我做錯了什麼?最終,我希望視圖模型能夠接入更多事件,而我知道這將是另一項挑戰。但是現在我甚至無法在Ajax請求完成時正確更新綁定。
這裏發生過的教程: http://knockoutjs.com/documentation/plugins-mapping.html
-------------------- UPDATE ------------- -------------
我可以通過引用該StackExhange後回答我的問題:
Knockout JS mapping plugin confusion
var projectId = @Model.Project.Id;
var viewModel ={};
$.ajax({
type: "GET",
url: "/Projects/JsonDetails",
data: {id: projectId},
success: function (data) {
viewModel.stories = ko.mapping.fromJS(data.stories);
ko.applyBindings(viewModel);
}
});
問題是我需要有一個空視圖模型爲此工作。
也許我很困惑。我認爲使用映射插件的意義在於,我不必定義所有的可觀察對象。我的理解是,調用'ko.mapping.fromJS(data)';'會爲我創造它們。如果我有一個更大的可觀察對象的大對象? – sheldonj 2012-03-13 22:17:19
這是正確的 - 它會創建來自對象的可觀察對象。但是,如果您在定義所有observable(如頁面加載)之前嘗試使用viewmodel,則會看到一個錯誤(如您的故事未定義)。 – 2012-03-13 22:37:54
我沒有注意到你沒有在頁面加載中應用綁定,所以顯然你不會在這種情況下得到錯誤。 – 2012-03-13 22:40:01