首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点击事件解耦

点击事件解耦
EN

Stack Overflow用户
提问于 2016-08-02 02:44:08
回答 1查看 105关注 0票数 1

我在Plunkr有我的Angular代码

这不是学校的考试什么的。这是我自己对AngularJS的一些前端处理的试用和实验,所以请随时帮助我。

该代码包含两个ng-repeats div,子控制器为父控制器。这两个ng-click以某种方式交织在一起,并对它们的行为保持警惕。我尝试了不同的切换函数toggleLaptopChoice,toggleTVChoice,但无法让它们正常工作。

问题:

1-产品列表:购买2台电视会将它们列在笔记本电脑部分。

2- TV产品覆盖了笔记本电脑产品。

1和2是耦合和解耦问题。另外,如何将{{laptop.product}},{{television.product}}绑定到ng-click标签?ng-click应该在标签上还是在输入本身上?

3-如何绑定手续费,当手续费发生变化时,合计会自动更新?(我在考虑添加一个指令,但我想让两个Ctrls来处理所有事情,而不是需要额外的服务)。

4-我处理好作用域了吗?提供更好的方法来处理合计(合计|合计计算)

5-进一步优化示例代码的建议?更多的灵活性,清晰度和更少但有用的抽象。

也许,进一步开发每种产品的数量。购买检查将成为将产品从购物车中丢弃的一种手段。

非常感谢。

代码语言:javascript
复制
<div ng-form name="orderForm" ng-controller= "shoppingListCtrl as sl">
  <label for="">Configurate (backend) Handling fee: USD$ </label>
  <input type="number" name="fee_input" ng-model="sl.fee" ng-init="sl.fee=7.50"/>
  <span class="error" ng-show="orderForm.fee_input.$error.number">
        Not valid number!</span>
  <!-- need ng-form name="orderForm" in div to trigger validation on ng-show "orderForm.fee_input" -->
  <br>
  <br>
  <div ng-controller= "merchandiseListCtrl as ml" style="border: 2px solid olive; padding:0 0 1em 1em">
    <h3>Laptop List</h3>
    <table>
      <thead>
        <tr>
          <th>Product</th>
          <th>Purchased</th>
          <th>Price</th>
          <th>Tax</th>
        </tr>
      </thead>
      <tr ng-repeat="laptop in ml.laptops">
        <td>{{laptop.product}}</td>
        <td>
          <!--<label for="laptopCheck" ng-click="$event.stopPropagation();"> http://stackoverflow.com/a/26962680/5828821-->
          <label for="laptopCheck" ng-click="ml.toggleHandler(laptop, ml.laptops, ml.laptopTotal, sl.fee);">
            <!--<input id="laptopCheck" type="checkbox" class="ng-pristine ng-valid" ng-click="ml.toggleSelection($event,laptop)" ng-model="laptop.purchased" ng-init="laptop.purchased=false">-->
            <input id="laptopCheck" type="checkbox" ng-model="laptop.purchased">
          </label>
        </td>
        <td>{{laptop.price}}</td>
        <td>{{$parent.sl.tax}}</td>
      </tr>
    </table>

    <!-- display the selection -->
    Laptop count: {{ ml.laptopTotal.count }} units
    <br>
    <div ng-if="ml.laptopTotal.products">
      <ul ng-repeat="product in ml.laptopTotal.products">
        <li>{{$index+1}}) {{product}}</li>
      </ul>
    </div>
    <br>
    Price for selected laptops before tax: {{ml.laptopTotal.value | currency:"USD$ ":2 }}
    <br>
    Taxing info: {{ml.getTax()}} %

    <br>
    <h3>Television List</h3>
    <table>
      <thead>
        <tr>
          <th>Product</th>
          <th>Purchased</th>
          <th>Price</th>
          <th>Tax</th>
        </tr>
      </thead>
      <tr ng-repeat="television in ml.televisions">
        <td>{{television.product}}</td>
        <td>
          <label for="televisionCheck" ng-click="ml.toggleHandler(television, ml.televisions, ml.televisionTotal, sl.fee);">
            <input id="televisionCheck" type="checkbox" ng-model="television.purchased">
          </label>
        </td>
        <td>{{television.price}}</td>
        <td>{{$parent.sl.tax}}</td>
      </tr>
    </table>
    TV count: {{ ml.televisionTotal.count }} units
    <br>
    <div ng-if="ml.televisionTotal.products">
      <ul ng-repeat="product in ml.televisionTotal.products">
        <li>{{$index+1}}) {{product}}</li>
      </ul>
    </div>
    <br>
    Price for selected televisions before tax: {{ml.televisionTotal.value | currency:"USD$ ":2 }}
    <br>
    Taxing info: {{ml.getTax()}} %
    <br>
    <label for="">$scope element: </label>{{access.child}}
    <br>
    _____________________________________________________________________________
    <br>
    <br>
    <label for="">Grand Total: </label>{{ml.televisionTotal.altogether | currency:"USD$ ":2 }}
    <br>
    <br>
    ________________STILL INSIDE the scope of <strong>merchandiseListCtrl</strong>________________
  </div>
    <br>

  ______________NOW <strong>OUTSIDE that scope</strong>, it's shoppingList scope NOW______________
  <br>This is a <i>{{access.child}}</i>
  <br>
  <br>
  <span style='color:gray'>Formula for total: TOTAL = (total of selected laptops + total of selected televisions)*((100+tax)/100) +handling_fee</span>
  <br>
  <strong>Shopping at {{sl.market}}, the total for your cart <span ng-if="sl.count"> ( {{sl.count}} items ) </span> is {{ sl.total | currency:"USD$ ":2}}</strong>
  Your shopping cart to checkout:
  <br>
  <div ng-if="ml.products">
    <ul ng-repeat="product in ml.products">
      <li>{{$index+1}}) {{product}}</li>
    </ul>
    <br>
    The user interactive, selected data can be further proceeded through a form Submit button for back-end processing.
  </div>

</div>
EN

回答 1

Stack Overflow用户

发布于 2016-08-02 06:42:27

我解决了我的问题1、2和3(简单的$watch就可以完成任务)。测试结果见Plukr。

选定的笔记本电脑和电视产品只是数组,因此将它们推送到新的数组中比尝试合并对象更有意义。

4&5等待您的建议和帮助。另外,如何将产品名称绑定到复选框?点击华硕也会切换复选框。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38705944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档