MVC 5使用spa模板无法显示视图

时间:2014-07-15 19:33:00

标签: knockout.js asp.net-mvc-5 single-page-application

我遇到了显示所有视图的问题。 (没有js错误) 无论如何,当我去产品或家里时,两个视图都显示出来,我不明白为什么。是不是ko:应该限制一个或另一个视图? 我错过了什么?

Index.cshtml

@section SPAViews {
    @Html.Partial("_Home")
    @Html.Partial("_Products")
}
@section Scripts{
    @Scripts.Render("~/bundles/knockout")
    @Scripts.Render("~/bundles/app")
}

_Home.cshtml

<!-- ko with: home -->
...
<!-- /ko -->

_Products.cshtml

<!-- ko with: products -->
...
<!-- /ko -->

products.viewmodel.js

function ProductsViewModel(app, dataModel) {
    var self = this;

    self.query = ko.observable();

    Sammy(function () {
        this.get('#products', function () {
            $.ajax({
                method: 'get',
                url: app.dataModel.productsUrl,
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    console.log(data);
                    self.query(data.query);

                }
            });
        })
    });

    return self;
}

app.addViewModel({
    name: "Products",
    bindingMemberName: "products",
    factory: ProductsViewModel
});

home.viewmodel.js

function HomeViewModel(app, dataModel) {
    var self = this;

    Sammy(function () {
        this.get('#home', function () {
            console.log('home');
        });
        this.get('/', function () { this.app.runRoute('get', '#home') });
    });

    return self;
}

app.addViewModel({
    name: "Home",
    bindingMemberName: "home",
    factory: HomeViewModel
});

软件包:

 bundles.Add(new ScriptBundle("~/bundles/app").Include(
        "~/Scripts/sammy-{version}.js",
        "~/Scripts/app/common.js",
        "~/Scripts/app/app.datamodel.js",
        "~/Scripts/app/app.viewmodel.js",
        "~/Scripts/app/home.viewmodel.js",
        "~/Scripts/app/products.viewmodel.js",
        "~/Scripts/app/_run.js"));

1 个答案:

答案 0 :(得分:0)

这可能是因为对with约束的误解。 From the docs

  

with绑定创建一个新的绑定上下文,以便后代元素绑定在指定对象的上下文中。

所以这只是切换上下文。它仍将显示两个部分。

你可能在the if binding之后(和相应的ifnot binding),记录如下:

  

if绑定导致标记的一部分出现在文档中(并且应用了数据绑定属性),仅当指定的表达式求值为true时...

您应该使用此if绑定并将表达式更改为计算为布尔值的值。