0

简单的要求 - 我的视图模型中的一个可淘汰的可观察数组,需要填充到数据上下文模块中。2个不同的模块是问题的核心。

基本问题是,如果一个可淘汰的 observable 是一个函数,如何将它作为参数传递,以及这样一个变量的作用域是什么。它是全局的,因为它是可观察的吗?我使用的模式直接来自 John Papa 的 SPA Jumpstart 课程,但似乎对我不起作用,除非我在某处错过了括号或返回语句。我尝试了许多不同的组合。

使用 JP 热毛巾 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
}); 

以下是数据上下文模块。尝试将 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
4

3 回答 3

0

data-bind="text: summary().Count == WRONG data-bind="text: Count== RIGHT

Duh..被错误语句抛出。但是感谢大家的回复。

于 2013-04-29T03:39:20.753 回答
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 模块是如何工作的。怀疑您显示的不是实际代码。

于 2013-04-29T05:38:54.793 回答
0

@xdenser 已正确识别出您的代码中最重要的问题。

返回数据上下文;
...
// 因为你返回了,所以永远不会执行;经理未定义。
var manager = createBreezeManager();

你没有说明错误。我们敢打赌,当您调用视图模型时,您会收到“经理未定义”错误getProductionSummary。将行向上移动(最好靠近 datacontext 的顶部),你会没事的:

var manager = createBreezeManager();
...
返回数据上下文;

这一切似乎有点受折磨。为什么不取消createBreezeManager并开始如下?

变种经理=新的微风.EntityManager(config.dataEndPoints);

您还有一个有点过于复杂的问题querySucceeded,可能就像这样简单:

函数 querySucceeded(data) { summaryObservableArray(data.results); }
于 2013-04-29T00:40:06.180 回答