表单绑定

1. 双向绑定

b-model 仅支持 input,textarea,select3种html标签. 这个行为属性做两件事情.

  • 把字段的值设置在当前input的value;
  • input输入修改会把value的值赋值给字段.

注意: input 的type类型必须声明是哪种类型(text,radio,checkbox)等.

示例:

page.message 有3个地方用到, b-model, b-text, b-click点击的时候,也会拿到message去做处理.

  1. var bs = bui.store({
  2. scope: "page",
  3. data: {
  4. message: "Hello bui.js",
  5. },
  6. methods: {
  7. reverseMessage: function (e) {
  8. var a = this.message.split(' ').reverse().join(' ')
  9. this.message = a;
  10. }
  11. }
  12. })
  1. <div id="searchbar" class="bui-searchbar bui-box">
  2. <div class="span1">
  3. <div class="bui-input">
  4. <i class="icon-search"></i>
  5. <input type="text" value="" placeholder="请输入关键字" b-model="page.message" />
  6. </div>
  7. </div>
  8. </div>
  9. <div class="section-title">正在输入:
  10. <span class="result" b-text="page.message"></span>
  11. <div class="bui-btn" b-click="page.reverseMessage">反序输入值</div>
  12. </div>

效果预览

查看效果

b-model 的值支持3种数据类型

  • 字符串: 用于单选或输入
  • 布尔值: 用于多选
  • 数组: 用于多选

2. 单选双向

page.sex 的值是string, 会先设置回对应的value="女"的input, name的值的sex1 不是必须的, 这个是h5用来对选择进行分组的. b-text 用来输出当前的选中值.

  1. var bs = bui.store({
  2. scope: "page",
  3. data: {
  4. sex: "女",
  5. }
  6. })
  1. <label><input type="radio" name="sex1" value="男" b-model="page.sex"></label>
  2. <label><input type="radio" name="sex1" value="女" b-model="page.sex"></label>
  3. 性别: <span b-text="page.sex"></span>

3. 多选双向

多选是一个数组, 里面的值会跟自己本身的值进行比较,如果一致,会是选中状态. b-text 输出数组会加上逗号.

  1. var bs = bui.store({
  2. scope: "page",
  3. data: {
  4. citys: ["广州","深圳"],
  5. }
  6. })
  1. <label><input type="checkbox" name="city" value="广州" b-model="page.citys">广州</label>
  2. <label><input type="checkbox" name="city" value="汕头" b-model="page.citys">汕头</label>
  3. <label><input type="checkbox" name="city" value="深圳" b-model="page.citys">深圳</label>
  4. <label><input type="checkbox" name="city" value="东莞" b-model="page.citys">东莞</label>
  5. <div class="section-title">多选: 城市: <span b-text="page.citys"></span></div>

4. 状态联动

b-model的值是布尔值时, 加上b-show 可以根据数据的状态来控制当前元素的显示或者隐藏.

  1. var bs = bui.store({
  2. scope: "page",
  3. data: {
  4. show: true,
  5. }
  6. })
  1. <!-- 初始化显示 -->
  2. <p b-show="page.show">我是A,被控制的内容</p>
  3. <!-- 初始化隐藏 -->
  4. <p b-show="!page.show">我是B,跟A相反的状态</p>
  5. <label><input type="checkbox" b-model="page.show" />点击可以控制A和B: <span b-text="page.show"></span></label>

效果预览

查看效果

5. 选择列表

下面只是展示 select 的用法, 实际上移动端我们一般使用 bui.select控件.

单选

  1. var bs = bui.store({
  2. scope: "page",
  3. data: {
  4. selected: "B", // 单个select初始化的值
  5. options: [ // 单选多选的数据源
  6. { text: 'One', value: 'A' },
  7. { text: 'Two', value: 'B' },
  8. { text: 'Three', value: 'C' }
  9. ]
  10. },
  11. templates: {
  12. tplSelect: function (data) {
  13. var html ='';
  14. data.forEach(function (item,i) {
  15. // value 属性必须有
  16. html +=`<option value="${item.value}">${item.text}</option>`
  17. })
  18. return html;
  19. }
  20. }
  21. })
  1. <select b-model="page.selected" b-template="page.tplSelect(page.options)" ></select>
  2. <span>Selected: <b b-text="page.selected"></b></span>

多选

只是把选择项变成了数组, 把select加多了个属性 multiple.

  1. var bs = bui.store({
  2. scope: "page
  3. data: {
  4. multipleSelectes: ["A","B"], // 多选select初始化的值是一个数组
  5. options: [ // 单选多选的数据源
  6. { text: 'One', value: 'A' },
  7. { text: 'Two', value: 'B' },
  8. { text: 'Three', value: 'C' }
  9. ]
  10. },
  11. templates: {
  12. // 单选多选共用模板
  13. tplSelect: function (data) {
  14. var html ='';
  15. data.forEach(function (item,i) {
  16. // value 属性必须有
  17. html +=`<option value="${item.value}">${item.text}</option>`
  18. })
  19. return html;
  20. }
  21. }
  22. })
  1. <select b-model="page.multipleSelectes" multiple b-template="tplSelect(page.options)" b-command="append">
  2. <option disabled value="">请选择</option>
  3. </select>
  4. <span>Selected: <b b-text="page.multipleSelectes"></b></span>

这里会有个 b-command 属性,用来告诉模板第1次渲染的时候使用什么方法?

  • html 替换数据
  • append 在后面增加数据
  • prepend 在前面增加数据

单选联动

联动的示例,增加了事件绑定, $index是内置对象,代表点击当前dom的索引, 有意思的是, 这里为什么是 $index 而不是 i ? i 是每次都从0开始的, 当数据有增删改以后, 索引值是不确定的, 而 $index 是根据你当前的dom所在的索引, 这个跟数组的索引是一一对应的. 更多内置对象,请查看事件绑定章节.

  1. var bs = bui.store({
  2. scope: "page",
  3. data: {
  4. selectA: [ // 联动select的数据源
  5. { text: 'One', value: 'A' },
  6. { text: 'Two', value: 'B' },
  7. { text: 'Three', value: 'C' }
  8. ],
  9. selectB: [],
  10. },
  11. methods: {
  12. addToB: function (index) {
  13. this.selectB.push(this.selectA[index]);
  14. this.selectA.splice(index,1);
  15. },
  16. addToA: function (index) {
  17. this.selectA.push(this.selectB[index]);
  18. this.selectB.splice(index,1);
  19. }
  20. },
  21. templates: {
  22. tplSelectA: function (data) {
  23. var html ='';
  24. data.forEach(function (item,i) {
  25. // value 属性必须有
  26. html +=`<option value="${item.value}" b-click='page.addToB($index)'>${item.text}</option>`
  27. })
  28. return html;
  29. },
  30. tplSelectB: function (data) {
  31. var html ='';
  32. data.forEach(function (item,i) {
  33. html +=`<option value="${item.value}" b-click='page.addToA($index)'>${item.text}</option>`
  34. })
  35. return html;
  36. }
  37. }
  38. })
  1. <div class="bui-box">
  2. <div class="span1">
  3. <select b-template="page.tplSelectA(page.selectA)" class="bui-select" multiple>
  4. </select>
  5. </div>
  6. <div class="span1">
  7. <select b-template="page.tplSelectB(page.selectB)" class="bui-select" multiple >
  8. </select>
  9. </div>
  10. </div>

效果预览

查看效果

多选联动

这个例子是一个自定义的模拟select, 我们放在综合案例里面讲.

弹窗选择交互