使用cshtml模板动态绑定挖空组件会破坏视图模型

时间:2016-04-05 15:07:17

标签: asp.net-mvc knockout.js components

我的SPA中有淘汰组件的问题,在某个页面我试图实现一个组件;通过params属性传递的所有可观察量都按预期工作。但是当我在组件的viewmodel中创建ko.observable(), ko.computed, ..时,它们就不能正常工作了。 (顺便说一句,我们正在使用asp.net mvc,我们需要提供cshtml文件作为模板,视图中的剃刀帮助我们提供了几种解析选项)

因此获取文件不是直接问题,奇怪的是,在cshtml文件中,我无法使用展开的text: test,我必须编写text: test()。计算机也没有更新,似乎什么也没做。

我认为我缺少的是组件永远不会通过ko.applyBindings()添加,但这纯粹是猜测。请问有人对此有所了解吗?

如何在页面加载后添加挖空组件。是的,我一直在四处寻找,整天都在摆弄,但却无济于事。提前谢谢。

这是在我们的主页上。

<track-item-list params="value: data, selected: selectedItems"></track-item-list>

在脚本标记内:

if (!ko.components.isRegistered('track-item-list')) {
        ko.components.register('track-item-list', { require: '@Url.Content("~/Scripts/viewmodels/items/_cItemList.js")' });
    }

有一个viewmodel js文件:

define(['knockout', 'cshtml!/items/_cItemList'], function (ko, cshtmlString) {

    function ItemViewModel(params) {
        var self = this;
        self.selected = params.selected;
        self.test = ko.observable('Hello World!');
    }

    return { viewModel: ItemViewModel, template: cshtmlString };
});

cshtml模板:

<span data-bind="text: selected().length"></span>
<ul data-bind="foreach: selected">
    <li data-bind="text: Total"></li>
</ul>
<span data-bind="text: test"></span>

cshtml文件通过自定义脚本加载:

define(['jquery'], function($) {

    var buildText = {};

    return {

        load: function (name, req, onLoad, config) {
            var self = this,
            file = name,
            segments = file.split('/');

            // If the module name does not have an extension, append the default one
            if (segments[segments.length - 1].lastIndexOf('.') == -1) {
                file += '.cshtml';
            }

            $.get(name, function (html, status, xhr) {
                console.log('html loaded: ' + name);
                onLoad(html);
            });
        }
    };
});

0 个答案:

没有答案