2011-09-15 61 views
0

我有一个“选项”对象的数组。每个“选项”都包含一个“名称”,“描述”和一个“选定”布尔型字段,用于指示是否选中了它。我已经创建了一个模板来呈现选项,并且页面输出正确无误。布尔属性不触发相关的可观察触发器

但是,我创建的触发器应该捕捉“Selected”字段状态的变化似乎不起作用。如果选项数组以任何方式变化,那么“ajaxTrigger”从属观察值应触发对服务器的调用,但似乎并非如此。

任何人都可以看到我要去哪里错了吗?

JSON数据:

{ 
    "Name": "Add Helicopter Excursion", 
    "Description": "Enjoy a holiday excursion", 
    "Code": "HEL", 
    "Selected": false 
}, { 
    "Name": "Add Scuba Diving", 
    "Description": "Go on a scuba diving trip", 
    "Code": "SCU", 
    "Selected": false 
} 

视图模型:

var viewModel = { 
    // other view model properties removed for this example 
    options: ko.observableArray(@(Html.Raw(Json.Encode(Model.Options)))) 
} 

viewModel.ajaxTrigger = ko.dependentObservable(function() { 
    // other triggers removed for this example 
    this.options(); 
    GetPrices();  
}, viewModel); 

模板:

<script id="OptionsTemplate" type="text/x-jQuery-tmpl"> 
    <li> 
    <input type="checkbox" data-bind="checked: Selected" /> 
    <span data-bind="text: Name"> </span> <span data-bind="text: Description"> </span> 
    </li> 
</script> 

UI:

<ul data-bind='template: {name: "OptionsTemplate", foreach: options}'></ul> 

回答

1

observableArrays仅通知对数组本身的更改(添加/删除项目,完全替换数组)。它不会触发对各个项目的可观察变化。如果您希望dependentObservbale触发,那么您需要使Selected成为可观察值,并确保您访问dependentObservable中的每个项目的Selected值。

+0

谢谢。我如何使Selected属性成为一个observable,因为它的属性是属于am数组中的一个项目? – BrightonDev

+0

有几种方法可以做到这一点。可能最简单的方法就是在调用applyBindings之前遍历数组,并为每个项目创建一个可观察值设置为当前值:'item.selected = ko.observable(item.selected);' –

+0

这就是我在视图之外做的事情模型? – BrightonDev