【问题标题】:Angularjs: is this way of writing wrong?Angularjs:这种写法有错吗?
【发布时间】:2014-08-07 19:24:18
【问题描述】:
<input ng-model="search" type="text">
<table ng-if="search.length > 2 || search.length == 0" 
       ng-init="somerows = getdata()">
   <tr ng-repeat="row in somerows | filter:search">...</tr>
</table>

有时它会以这种*视觉方式更快地思考
但这是错的吗?

【问题讨论】:

    标签: angularjs binding angular-ng-if angularjs-ng-init


    【解决方案1】:

    我认为ng-init 只有在编译元素时才会执行,所以你的getdata() 只会在表格出现时被调用。键入时会发生以下情况:

    1. 空白search:显示表格,调用getdata()
    2. 类型“a”:表已隐藏,getdata() 未调用
    3. 类型“b”:表仍然隐藏,getdata() 未调用
    4. 类型'c':显示表格,调用getdata()
    5. 类型 'd':表格仍会显示,因此不会调用 getdata()
    6. 以此类推,ng-init 将不会被执行,直到表格再次被隐藏并被ng-if 重新显示

    如果你有 10 个字符并且 CTRL+X 来剪切它们,你的搜索词是空白的,但是 getdata() 仍然没有被调用,因为表格仍然显示并且 ng-init 没有被执行。如果您粘贴一些内容,则仍然不会调用 getdata(),因为该表是可见的并且 ng-init 已被执行。

    我认为最好看一下搜索词然后致电getdata()

    $scope.$watch('search', function(newValue) {
        if (typeof(newValue) === "string" && 
                  (newValue.length == 0 || newValue.length > 2)) {
            $scope.getdata();
        }
    }
    

    【讨论】:

    • 查看this plnkr。当 if 添加或删除元素时会调用 ng-init,但如果您开始输入,它只会在您点击第三个字符时调用,而不是之后。
    • 只是为了添加,ng-if 实际上添加或删除了关联的 DOM 对象,这就是 ng-init 直到第三个字符才执行的原因,因为它实际上还不存在。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多