Vuejs关于过滤器的问题



 var kinds = [
      {"id":"1"},
      {"id":"2",},
      {"id":"3",},
      {"id":"4",}
    ]

    var list = [
            {"pid":"1",},
            {"pid":"1",},
            {"pid":"2",},
            {"pid":"2",},
            {"pid":"3",},
            {"pid":"3",},
            {"pid":"4",},
            {"pid":"4",}
        ]

    <script id="menuList" type="text/template">
        <%_.each(kinds, function(pitem) {%>
            <div class="mOrder-menu-con-item">
                <h1><%=pitem.id%></h1>
                <ul>
                    <%_.each(list, function(sitem) { if(sitem.pid == pitem.id) {%>
                        <li>
                            <%=sitem.id%>
                        </li>
                    <%}});%>
                </ul>
            </div>
        <%});%>
    </script>

如上,underscore可以在模板上写一些逻辑来做到根据 kinds 数组的id来过滤一部分 list 数组。

我尝试用Vuejs的过滤器实现上面这个过滤:


 <ul id="demo">
    <li v-repeat="kinds:kinds">
        id:{{kinds.id}}
        <div v-repeat="list:list | isInParent pid kinds.id">
            <span>{{ list.pid }}{{kinds.id}}</span>
        </div>
    </li>
</ul>

<script>
  var kinds = [
      {"id":"1",},
      {"id":"2",},
      {"id":"3",},
      {"id":"4",}
  ]

  var list = [
        {"pid":"1",},
        {"pid":"1",},
        {"pid":"2",},
        {"pid":"2",},
        {"pid":"3",},
        {"pid":"3",},
        {"pid":"4",},
        {"pid":"4",}
    ]

  Vue.filter('isInParent', function (arr,value,pValue) {
    var array = []
    console.log(pValue)
    arr.forEach(
        function (obj,index) {
            if (obj[value] == pValue){
                array.push(arr[index])
            }
        }
    )
    return array;
  })
  var demo = new Vue({
      el: '#demo',
      data: {
          kinds: kinds,
          list: list
      }
  })
</script>

Vuejs的只能传递字符串给过滤器 -- "list:list | isInParent pid kinds.id" ,无法传递repeat中的 kinds.id 的值。

想请问使用Vuejs如何实现underscore这种过滤。

模板引擎 vue mvvm JavaScript

isod3 10 years ago

建议过滤数组不要在模版里进行,最好放在controller里面。如楼上所说,filter用来格式化输出就好了。

屋顶上的天线 answered 10 years ago

谢邀。特地去学了underscore和vuejs(笑)。

大片代码可以用jsfiddle来表达,可以直接显示出来。

具体看下面的执行代码。
http://jsfiddle.net/dxxdkn2p/1/

你要的是这个嘛?

PS:~~我觉得filter主要是给一个值做转化用的,而不是做过滤的,像是日期格式化啦,单词变大写啦。~~有没有考虑用lodash替换underscore?

UPDATE

这样呢?
http://jsfiddle.net/dxxdkn2p/3/

UPDATE2

在看完源码之后,我感觉到

这是一个坑,这绝对是一个坑(╯‵□′)╯︵┻━┻

你当我没说上面那句话。
http://jsfiddle.net/dxxdkn2p/7/

cicivan answered 10 years ago

Your Answer