将knockout observables作为参数传递

时间:2013-04-28 08:23:33

标签: knockout.js breeze

简单要求 - 我的视图模型中的一个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

3 个答案:

答案 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模块是如何工作的。怀疑你显示的不是实际代码。