【发布时间】:2013-04-29 13:44:42
【问题描述】:
简单的要求 - 我的视图模型中的一个可淘汰的可观察数组,需要填充到数据上下文模块中。 2个不同的模块是问题的核心。
基本问题是,如果一个可淘汰的 observable 是一个函数,如何将它作为参数传递,以及这样一个变量的作用域是什么。它是全局的,因为它是可观察的吗?我使用的模式直接来自 John Papa 的 SPA Jumpstart 课程,但似乎对我不起作用,除非我在某处错过了括号或返回语句。我尝试了许多不同的组合。
使用 JPs hot towel 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 方法中的敲除 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
【问题讨论】:
-
KO observable 变量(或属性)的作用域与any变量(或属性)的作用域相同。另外,不要忘记解释“错误”是什么。
-
是的,错误是什么?但我还要说,返回
summaryObservableArray(summary)是没有意义的。这是因为一个可观察的简单函数在写入时会执行return this;,在这种情况下将是window对象。 -
这一行
var manager = createBreezeManager();没有被执行,manager.executeQuery(query)应该抛出错误。 -
道歉..错误是无法解析绑定。↵消息:ReferenceError:未定义摘要;↵绑定值:文本:摘要()。计数这是在我进行数据绑定的视图模型中到summary().Count 和summary().Percentage。 Breeze 正在按应有的方式执行。我可以看到返回的值我什至可以在 datacontext 中看到我的 observablearray 中的值,但是绑定失败了。
-
我的意思是错误在视图中......而不是视图模型。
标签: knockout.js breeze