在Knockout中对同一目标进行不同绑定的正确方法是什么。
这些似乎不起作用:
<div data-bind="template: { name: 'voucher-template', foreach: voucher }" data-bind="visible: showVoucher"></div>
或
<div data-bind="template: { name: 'voucher-template', foreach: voucher }, visible: showVoucher"></div>
完整测试代码:
<script>
function VoucherViewModel() {
this.voucher = [
{
VoucherNumber: "100000",
VoucherImage: "someurl",
VoucherExpiry: "20/3/12",
VoucherRedeemed: true,
VoucherDesc: "ddwqdwqdwqd",
VoucherPuchaseDate: "20/12/11",
VoucherPrice: "50"
},
{
VoucherNumber: "200000",
VoucherImage: "someurl",
VoucherExpiry: "20/3/12",
VoucherRedeemed: true,
VoucherDesc: "ddwqdwqdwqd",
VoucherPuchaseDate: "20/12/11",
VoucherPrice: "50"
}]
};
var viewModel = {
showVoucher: ko.observable(true)
};
$(function () {
//VIEWMODEL
ko.applyBindings(viewModel);
//TEMPLATES
ko.applyBindings(new VoucherViewModel());
});
</script>
<div data-bind="template: { name: 'voucher-template', foreach: voucher }, visible: showVoucher"></div>
<script type="text/html" id="voucher-template">
<h3 data-bind="text: VoucherNumber"></h3>
</script>
答案 0 :(得分:0)
您可以在Knockout中指定多个绑定,方法是在同一个data-bind
属性中用逗号分隔它们(它本质上是一个JavaScript对象文字)。所以,你会想做:
data-bind="bindingOne: valueOne, bindingTwo: { valueTwo: 'two' }, bindingThree: valueThree"
答案 1 :(得分:0)
似乎是双ko.applyBindings导致问题。
这有效:
$(function () {
var viewModel = {
showVoucher: ko.observable(true),
voucher: ko.observableArray([
{
VoucherNumber: "100000",
VoucherImage: "someurl",
VoucherExpiry: "20/3/12",
VoucherRedeemed: true,
VoucherDesc: "ddwqdwqdwqd",
VoucherPuchaseDate: "20/12/11",
VoucherPrice: "50"
},
{
VoucherNumber: "200000",
VoucherImage: "someurl",
VoucherExpiry: "20/3/12",
VoucherRedeemed: true,
VoucherDesc: "ddwqdwqdwqd",
VoucherPuchaseDate: "20/12/11",
VoucherPrice: "50"
}
])
};
//VIEWMODEL
ko.applyBindings(viewModel);
});
如果有更好的方式来写这个,请告诉我。
下面编辑的版本,也尝试了映射:
<script>
function getVoucherData() {
//some ajax call;
return data = { "voucher" : [{
VoucherTitle: "Offer title 1",
VoucherNumber: "100000",
VoucherImage: "someurl",
VoucherExpiry: "20/3/12",
VoucherRedeemed: true,
VoucherDesc: "ddwqdwqdwqd",
VoucherPuchaseDate: "20/12/11",
VoucherPrice: "50"
},
{
VoucherTitle: "Offer title 2",
VoucherNumber: "200000",
VoucherImage: "someurl",
VoucherExpiry: "20/3/12",
VoucherRedeemed: true,
VoucherDesc: "ddwqdwqdwqd",
VoucherPuchaseDate: "20/12/11",
VoucherPrice: "50"
}]
};
}
function initViewModel() {
var viewModel = {};
// PAGE SETUP
viewModel.showVoucher = ko.observable(true);
viewModel.showMyAccount = ko.observable(false);
// GET VOUCHER
var voucherData = getVoucherData();
voucherData.voucher.sort(function (left, right) {
return left.VoucherNumber > right.VoucherNumber
});
viewModel.voucher = ko.mapping.fromJS(voucherData.voucher);
// START
ko.applyBindings(viewModel);
}
$(function () {
initViewModel();
});
</script>
答案 2 :(得分:0)
这是我推荐的,据我所知,这是最好的做法。这是因为你在函数中的viewModel上设置了一个结构,而不是在以后附加,这更容易阅读。
$(function () {
function MyViewModel() {
// data
this.showVoucher = ko.observable(true);
this.showMyAccount = ko.observable(false);
this.voucher = ko.observableArray([]);
}
window.activeViewModel = new MyViewModel();
ko.applyBindings(window.activeViewModel);
// GET VOUCHERS
var voucherData = getVoucherData();
window.activeViewModel.voucher(voucherData.voucher)
});