简单要求 - 我的视图模型中的一个knockout可观察数组,需要在datacontext模块中填充。 2个不同的模块是问题的核心。
基本问题是如果一个knockout observable是一个函数,那么如何将它作为参数传递,以及这个变量的范围是什么。它是全球性的,因为它是一个可观察的吗?我正在使用的模式直接从John Papa的SPA Jumpstart课程中解除,但似乎对我没有用,除非我错过了某个地方的括号或返回声明。我尝试了很多不同的组合。
使用JPs热毛巾mvc模板,但不参考我的查询。
这是视图模型代码
define(['dataContext'], function (datacontext) {
var summary = ko.observableArray();
var initialise = false;
var prodModel= {
activate: activate,
title: 'Home View',
summary:summary
};
return prodModel;
//#region Internal Methods
function activate() {
if (!initialise)
{
initialise = true;
return getSummary();
}
return;
}
function getSummary () {
// Go to the context and populate the observable array
return datacontext.getProductionSummary(summary);
};
//#endregion
});
以下是datacontext模块。尝试将javascript数组分配给getProductionSummary方法中的knockout observable数组时发生错误。
值得一提的是,我也试图使用pushAll实用程序功能。
填充可观察数组的唯一事情是直接推入它,但即使我这样做,我也没有调用viewmodel代码中的值,就像我期望的普通变量一样。
define(['config','services/logger'],
function (config,logger) {
var getProductionSummary = function (summaryObservableArray) {
//Call Web API
var query = breeze.EntityQuery.from('getSummary');
return manager.executeQuery(query).then(querySucceeded).fail(queryFailed);
//Yay got the data.. lets play
function querySucceeded(data) {
var summary = [];
for (var i = 0; i < data.results.length; i++) {
summary.push(data.results[i]);
}
return summaryObservableArray(summary);
}
};
var datacontext = { getProductionSummary: getProductionSummary };
return datacontext;
// #region Internal functions
var manager = createBreezeManager();
function createBreezeManager () {
var mgr= new breeze.EntityManager(config.dataEndPoints);
return mgr;
};
function queryFailed(error) {
logger.log(error.message, null, 'dataContext', true);
}
//#endregion
});
这是视图中引发错误的位
<!--ko foreach:summary-->
<tr>
<td><span data-bind="text: summary().Count"></span></td>
<td><span data-bind="text: summary().Percentage"></span></td>
</tr>
<!--/ko-->
错误是
Unable to parse bindings.↵Message: ReferenceError: summary is not defined;↵Bindings value: text: summary().Count
答案 0 :(得分:0)
@xdenser已正确识别代码中最重要的问题。
return datacontext; ... // never executed because you returned; manager is undefined. var manager = createBreezeManager();
您没有说明错误。我们的赌注是,当您在viewmodel中调用getProductionSummary
时,会出现“管理器未定义”错误。向上移动线(最好靠近datacontext的顶部),你会没事的:
var manager = createBreezeManager(); ... return datacontext;
这一切似乎有点折磨。为什么不取消createBreezeManager
并开始如下?
var manager = new breeze.EntityManager(config.dataEndPoints);
你也有一些过于复杂的querySucceeded
,这可能就像这样简单:
function querySucceeded(data) { summaryObservableArray(data.results); }
答案 1 :(得分:0)
data-bind =“text:summary()。Count == WRONG data-bind =“text:Count == RIGHT
Duh ..被错误声明抛出。但感谢所有回应。
答案 2 :(得分:0)
<!--ko foreach:summary-->
<tr>
<td><span data-bind="text: Count"></span></td>
<td><span data-bind="text: Percentage"></span></td>
</tr>
<!--/ko-->
这是正确的观点
内部foreach
绑定上下文是数组项。
仍然不明白你的dataContext模块是如何工作的。怀疑你显示的不是实际代码。