2013-04-28 26 views
0

简单的要求 - 在我的视图模型中需要填充在datacontext模块中的淘汰赛观察数组。 2个不同的模块是问题的核心。传递淘汰赛observables作为参数

基本问题是,如果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的模块。尝试在getProductionSummary方法中将javascript数组分配给knockout observable数组时发生该错误。

值得一提的是,我也试图使用pushAll实用程序功能。

填充observable数组的唯一东西是直接将其推入,但即使我这样做,我没有在调用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 
+1

KO可观察变量(或属性)的范围与* any *变量(或属性)的范围相同。另外,不要忘记解释“错误”是什么。 – user2246674 2013-04-28 08:29:33

+0

是的,什么是错误?但是我也会说,返回'summaryObservableArray(summary)'是没有意义的。这是因为一个可观察的简单的''返回这个';'当写入时,在这种情况下将是'window'对象。 – 2013-04-28 10:32:29

+0

这行'var manager = createBreezeManager();'没有执行,'manager.executeQuery(query)'应该抛出错误。 – xdenser 2013-04-28 11:34:12

回答

0

@xdenser已经正确识别代码中的最显著的问题。

 
return datacontext; 
... 
// never executed because you returned; manager is undefined. 
var manager = createBreezeManager(); 

您没有声明错误。我们的赌注是,当您在您的视图模型中拨打getProductionSummary时,您会遇到“经理未定义”错误。将排队向上移动(最好靠近datacontext的顶部),你会很好:

 
var manager = createBreezeManager(); 
... 
return datacontext; 

这一切似乎都有点折磨。为什么不去掉createBreezeManager并开始如下?

 
var manager = new breeze.EntityManager(config.dataEndPoints); 

你也有一个有点过于复杂querySucceeded这可能是如此简单:

 
function querySucceeded(data) { summaryObservableArray(data.results); } 
+0

感谢沃德的回应。微风代码执行得很好。返回值并且datacontext中的KO数组被填充,但视图上的绑定失败,并且没有定义错误摘要。我在先前的注释中添加了完整的错误。 我在成功函数中填充数组的唯一原因是我认为将data.results直接添加到observable中会更昂贵,因为每个项目都会发出通知。我错了吗 ? – shai 2013-04-29 02:33:43

+0

注意将项目推入可观察数组的危险是正确的。幸运的是,'data.results' **已经是一个数组**了。通过直接使用它,你可以做同样的事情,当你构建'summary'并注入它时。 – Ward 2013-04-29 07:13:49

0

数据绑定=“TEXT:摘要()==算错 数据绑定=“text:Count == RIGHT

Duh ..被错误语句抛出。但感谢所有人的回应。

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