我构建了一个仪表板组件,该组件使用挖空组件绑定加载其他组件。使用打字稿。基本上它有效。
组件注册如下...
ko.components.register('camera-widget', {
viewModel: { require: 'Scripts/app/Widgets/CameraWidget/ViewModels/CameraWidgetViewModel' },
template: { require: 'text!Scripts/App/Widgets/CameraWidget/Views/CameraWidget.html' }
});
。并实例化使用组件绑定(其中 tagName = '相机小部件' 和参数 = {/* 一些初始值让组件加载其数据 */}):
<div data-bind="component: tagName, params: parameters"></div>
在Typescript中,CameraWidgetViewModel类定义如下:
import ko = require('knockout');
import PagerSettings = require('../Models/PagerSettings');
import PagerSettingsViewModel = require('./PagerSettingsViewModel');
import CameraViewModel = require('./CameraViewModel');
class CameraWidgetViewModel implements CameraWidget.ICameraWidgetViewModel {
constructor (data: any) {
if (data.someValue) {
// BOOOOM! data is undefined
}
}
}
export = CameraWidgetViewModel;
编译成JS的CameraWidgetViewModel类被包装在一个匿名函数中:
define(["require", "exports", 'knockout', '../Models/PagerSettings', './PagerSettingsViewModel'], function (require, exports, ko, PagerSettings, PagerSettingsViewModel) {
var CameraWidgetViewModel = (function () {
function CameraWidgetViewModel(data) {
}
});
});
如何管理要传递到该内部函数调用的组件绑定中的参数?
在 KNOCKOUT 关于组件绑定的文档中,您可以找到其所需的语法:
若要向组件提供参数,请传递具有以下属性的对象:
名称 ― 要注入的组件的名称。同样,这是可以观察到的。
params — 将传递给组件的对象。通常,这是一个包含多个参数的键值对象,通常由组件的视图模型构造函数接收。
来源:敲除组件绑定,副标题:API,强调我的
实例化绑定的方式将参数传递到component
绑定之外。它们应位于 params
属性后面的对象中。您必须使用此标记:
data-bind="component: { name: tagName, params: parameters }"
您没有从 CameraWidgetViewModel 文件中导出任何内容,因此实际上没有定义任何内容。但我也不认为你应该导出一个类,因为它看起来 knockout 期望返回一个函数,而不是构造函数。
我会尝试将其添加到文件底部:
function getViewModel(...args) {
return new CameraWidgetViewModel(...args);
}
export = getViewModel;