Wijmo 5

Input 101

这个页面显示如何开始使用Wijmo的Input控件。

入门

在KnockoutJS应用中开始使用Input控件的步骤:

  1. 添加对KnockoutJS, Wijmo和Wijmo的KnockoutJS绑定的引用。
  2. 添加一个视图模型提供数据和逻辑。
  3. 向当前页面添加一个Wijmo Input控件,并将它绑定到你的数据。
  4. (可选)添加一些CSS来自定义输入控件的外观。
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="css/bootstrap.css"/> <link rel="stylesheet" type="text/css" href="css/wijmo.css" /> <link rel="stylesheet" href="styles/app.css" /> <script src="scripts/knockout.js" type="text/javascript"></script> <script src="scripts/wijmo.js" type="text/javascript"></script> <script src="scripts/wijmo.input.js" type="text/javascript"></script> <script src="scripts/wijmo.knockout.js" type="text/javascript"></script> <script src="scripts/bindings/appBindings.js"></script> <script src="scripts/app.js"></script> <script src="scripts/viewmodels/appVM.js"></script> </head> <body> <!-- this is the InputNumber binding --> <div data-bind="wjInputNumber: { value: price, format: 'n', step: .5 }"></div></body> </html>
// create and apply application view model function viewModel1() { // value to bind to this.price = ko.observable(3.5); ............. }; (function () { ko.applyBindings(new viewModel1()); })();

Result (live):

AutoComplete

AutoComplete控件是一个自动完成的控件,允许你筛选它的项目列表为你的类型,以及从他的下拉列表直接选择一个值。

要使用AutoComplete控件,你必须至少设置itemsSource属性为一个填充列表的数据数组。 AutoComplete控件还提供了几个其它的属性来改变它的行为,比如cssMatch属性。 这个cssMatch属性允许你指定CSS类来突出符合你搜索条件的部分内容。

下面的实例使用了一个字符串数组通过设置itemsSource属性来填充AutoComplete控件的项目列表。 要看到一个搜索建议列表,在下面的AutoComplete控件键入"ab"或者"za"

<div class="app-input-group"> <label>itemsSource Only</label> <div data-bind="wjAutoComplete: {itemsSource: countries}"></div> </div> <div class="app-input-group"> <label>itemsSource & cssMatch</label> <div data-bind="wjAutoComplete: { itemsSource: countries, cssMatch: 'highlight'}"></div> </div>
.highlight { background-color: #ff0; color: #000; }

Result (live):

ComboBox

ComboBox控件与AutoComplete控件是非常相似的,但它不是提供一列你输入内容的建议,而会自动补全并且选择一个你键入的选项。

就像AutoComplete控件,你必须至少设置itemsSource属性为一个填充列表的数据数组。 你可能也会想要通过isEditable属性来指定ComboBox是否可编辑。 isEditable属性决定用户是否可以输入ComboBox列表中没有出现的值。

下面这个样例使用两个绑定同一个数据源的ComboBox,就像上面的AutoComplete控件那样。 第一个ComboBox的isEditable属性设为false,而第二个的isEditable属性设为真。

<div class="app-input-group"> <label>Non-Editable</label> <div data-bind="wjComboBox: { itemsSource: countries, isEditable: false}"> </div> </div> <div class="app-input-group"> <label>Editable</label> <div data-bind="wjComboBox: { itemsSource: countries, isEditable: true }"> </div> </div>

Result (live):

InputDate & Calendar

InputDate控件允许你通过一个下拉日历编辑和选择日期,同时防止你输入不正确的值。 InputDate的下拉日历可以作为一个独立的控件,并且可以在InputDate控件外独立使用。

InputDate和Calendar都指定了几个属性来改变控件的行为,最常用的属性包括:

下面的样例展示了如何使用这些属性。

<div class="app-input-group"> <label>Bound InputDate with min & max</label> <div data-bind="wjInputDate: { value: today, min: minDate, max: maxDate }"> </div> </div> <div class="app-input-group"> <label>Bound Calendar with min & max</label> <div data-bind="wjCalendar: { value: today, min: minDate, max: maxDate }" style="width:300px;"> </div> </div> <p> <b>Selected Date: <span data-bind="text: format(today, 'd')"></span></b> </p> <p> <b>Valid Range: <span data-bind="text: format(minDate, 'd')"></span> to <span data-bind="text: format(maxDate, 'd')"></span></b> </p>
var today = new Date(); this.today = ko.observable(today); this.minDate = ko.observable(new Date(today.getFullYear(), 0, 1)); this.maxDate = ko.observable(new Date(today.getFullYear(), 11, 31));

Result (live):

Selected Date:

Valid Range: to

InputDate, InputTime和InputDateTime Controls

与InputDate控件相同,InputTime控件允许你修改JavaScript日期的时间部分,InputTime控件和InputDate控件有许多共有的属性, 包括format, min, maxvalue。InputTime控件还提供了一个step属性,允许你在它的下拉表中指定分钟的数量。

InputDateTime控件结合了InputDate和InputTime控件,允许你设置JavaScript日期的日期和时间部分。 InputDateTime控件有两个下拉列表:一个用来选择日期,一个用来选择时间。

下面的样例说明了如何使用同时使用InputTime控件和InputDate控件。 注意这些控件共同编辑同一个JavaScript Date对象并且只更新它们负责的一部分。

这个样例也展示了一个InputDateTime控件,它更新JavaScript Date对象的时间和日期部分。

<div class="app-input-group"> <label>Bound InputDate with min, max, & format</label> <div data-bind="wjInputDate: { value: today, min: minDate, max: maxDate, format: 'MMM dd, yyyy' }"> </div> </div> <div class="app-input-group"> <label>Bound InputTime with min, max, & step</label> <div data-bind="wjInputTime: { value: today, step: 15, min: '07:00', max: '19:00' }"> </div> </div> <div class="app-input-group"> <label>Bound InputDateTime with min, max, format, and step</label> <div data-bind="wjInputDateTime: { value: today, format: 'MMM dd, yyyy hh:mm tt', min: minDate, max: maxDate, timeStep: 15, timeMin: '09:00', timeMax: '17:00' }"> </div> </div> <p> <b>Selected Date & Time: <span data-bind="text: format(today, 'G')"></span></b> </p>
var today = new Date(); this.today = ko.observable(today); this.minDate = ko.observable(new Date(today.getFullYear(), 0, 1)); this.maxDate = ko.observable(new Date(today.getFullYear(), 11, 31));

Result (live):

Selected Date & Time:

ListBox

ListBox控件展示了一列项目,允许你使用你的鼠标和键盘选中它们。 就像AutoComplete和ComboBox控件,你必须指定ListBox的itemsSource属性才能使用它。

下面的样例允许你在ListBox控件中选择一个项目同时展示控件的selectedIndexselectedValue属性。

<div class="app-input-group"> <div data-bind="wjListBox: { itemsSource: cities, control: listBox, selectedIndex: listBoxIndex, selectedValue: listBoxValue }" style="height:150px;width:250px;"> </div> </div> <p> <b>selectedIndex: <span data-bind="text: listBoxIndex"></span></b> </p> <p> <b>selectedValue: <span data-bind="text: listBoxValue"></span></b> </p>
this.listBox = ko.observable(undefined); this.listBoxIndex = ko.observable(undefined); this.listBoxValue = ko.observable(undefined);

Result (live):

selectedIndex:

selectedValue:

InputNumber

InputNumber控件允许你编辑数字,它会阻止你输入无效的数据并且在它被编辑的时候将数字格式化。 InputNumber可以在不指定它的任何属性情况下使用。不过,你通常会使用value属性来将它绑定到一些数据。

除了value属性,InputNumber控件提供了几个其他的属性可以被用来改变它的行为,比如:

下面的样例演示了如何使用所有这些属性。

<div class="app-input-group"> <label>Unbound with "n0" format</label> <div data-bind="wjInputNumber: { format: 'n0' }"></div> </div> <div class="app-input-group"> <label>Bound with "n" format</label> <div data-bind="wjInputNumber: { value: pi, format: 'n' }"> </div> </div> <div class="app-input-group"> <label>Bound with min (0), max (10), step, and "c2" format</label> <div data-bind="wjInputNumber: { value: price, format: 'c2', step: .5, min: 0, max: 10 }"> </div> </div> <div class="app-input-group"> <label>Unbound with placeholder and required="false"</label> <div data-bind="wjInputNumber: { placeholder: 'enter a number...', required: false, value: null }"> </div> </div>
this.pi = ko.observable(Math.PI); this.price = ko.observable(3.5);

Result (live):

菜单

菜单控件允许你创建一个简单的拥有可点击项目的下拉列表。就像ComboBox一样,Menu的项目可以通过itemsSource属性直接定义。 要指定显示在Menu的文本,你可以设置header属性。

Menu控件提供了两种方法来处理用户的选择,在每个菜单项目上指定一条指令或者指定一个itemClicked事件。 与itemClicked事件不同,指令是实现了以下两种方法的对象:

下面的样例演示如何使用这两种方法。

<div class="app-input-group"> <label>itemClicked Event</label> <div data-bind="wjMenu: { header: 'File', itemClicked: menuItemClicked}"> <span data-bind="wjMenuItem: {}"><i class="fa fa-file-o"></i>  <b>New</b><br><small><i>create a new file</i></small></span> <span data-bind="wjMenuItem: {}"><i class="fa fa-folder-open-o"></i>  <b>Open</b><br><small><i>open an existing file or folder</i></small></span> <span data-bind="wjMenuItem: {}"><i class="fa fa-save"></i>  <b>Save</b><br><small><i>save the current file</i></small></span> <span data-bind="wjMenuSeparator: {}"></span> <span data-bind="wjMenuItem: {}"><i class="fa fa-times"></i>  <b>Exit</b><br><small><i>exit the application</i></small></span> </div> <div data-bind="wjMenu: { header: 'Edit', itemClicked: menuItemClicked}"> <span data-bind="wjMenuItem: {}"><i class="fa fa-cut"></i>  <b>Cut</b><br><small><i>move the current selection to the clipboard</i></small></span> <span data-bind="wjMenuItem: {}"><i class="fa fa-copy"></i>  <b>Copy</b><br><small><i>copy the current selection to the clipboard</i></small></span> <span data-bind="wjMenuItem: {}"><i class="fa fa-paste"></i>  <b>Paste</b><br><small><i>insert clipboard content at the cursor position</i></small></span> </div> </div> <div class="app-input-group"> <label>Commands</label> <div data-bind="wjMenu: { header: 'Change Tax' }"> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: .25 }">+ 25%</span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: .10 }">+ 10%</span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: .05 }">+ 5%</span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: .01 }">+ 1%</span> <span data-bind="wjMenuSeparator: {}"></span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: -.01 }">- 1%</span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: -.05 }">- 5%</span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: -.10 }">- 10%</span> <span data-bind="wjMenuItem: { cmd: menuCommand, cmdParam: -.25 }">- 25%</span> </div> <div data-bind="wjInputNumber: { value: tax, format: 'p0', min: 0, max: 1, step: .05 }"></div> </div>
this.tax = ko.observable(.07); this.menuItemClicked = function (data, sender, args) { alert('You\'ve selected option ' + sender.selectedIndex + ' from the ' + sender.header + ' menu!'); }; this.menuCommand = { executeCommand: function (arg) { self.tax(self.tax() + arg); }, canExecuteCommand: function (arg) { if (wijmo.isNumber(arg)) { var val = self.tax() + arg; return val >= 0 && val <= 1; } return false; } };

Result (live):

  New
create a new file
  Open
open an existing file or folder
  Save
save the current file
  Exit
exit the application
  Cut
move the current selection to the clipboard
  Copy
copy the current selection to the clipboard
  Paste
insert clipboard content at the cursor position
+ 25% + 10% + 5% + 1% - 1% - 5% - 10% - 25%