2015-11-25 184 views
1

我有一個像這樣的僞代碼,使用單向綁定運算符(::)我試圖查看角度是否正在監視更改。所以我不得不將它包含在input標籤中。輸入標籤內部的model data應該在其之前解析爲一種方式,因爲它之前爲::。但是,如果我對輸入進行更改並單擊按鈕查看更改,它將反映日誌中的更改。但它不應該留意變化。Angularjs單向綁定綁定數據雙向

<!DOCTYPE html> 
<html ng-app="app"> 
<head> 
    <meta charset="utf-8"> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.2/angular-animate.js"></script> 
</head> 
<body class="container" ng-controller="ItemsController"> 
    <ul ng-repeat="item in ::items"> 
     <li> 
      <!-- in actual code the input will not be included --> 
      <input type="text" ng-model="::item.name"> {{ ::item.name }} 
      <!-- actual code --> 
      <!-- {{ ::item.name }} --> 
     </li> 
    </ul> 
    <button type="btn" ng-click="click()">Button</button> 

    <script> 
     angular.module('app', []) 
     .controller('ItemsController', function ($scope) { 
      $scope.items = [ 
       {name: 'item 1'}, 
       {name: 'item 2'}, 
       {name: 'item 3'} 
      ]; 

      $scope.click = function() { 
       for (var obj of $scope.items) { 
        console.log(obj.name); 
       } 
      }; 
     }) 
    </script> 
</body> 
</html> 

回答

2

一些事情。

是一次,沒有任何一種方式結合。當您只需要評估一次表達式而不注意更改時,該功能非常有用。

::在ng模型中什麼都不做,它仍然會更新您放置的值並更新項目名稱的範圍。

與此同時{{ ::item.name}}應該保持不變,因爲是一次性綁定,它不會監視其他更改。

因此,您將看到日誌中的更改,因爲值實際發生更改,不會更改的是視圖。

+0

來自angularjs doc「一次性綁定表達式的主要目的是提供一種方法來創建綁定,一旦綁定穩定,就會取消註冊並釋放資源。」現在,如果ng-model反映了這些變化,那麼它一定是在觀察變化(這是我想釋放的開銷)。因爲在我的實際AngularJS代碼中有很多模板,其中數據是從外部API獲取並綁定到模板,並且不會更改。如果在內部它仍然在觀察變化,那麼它是如何從開銷中解脫出來的? –

+0

當您想要顯示不會超時的數據時,應該添加一次綁定,因此您只需渲染信息,然後停止觀看並縮短摘要週期。但是如果你添加一個輸入是因爲你想綁定這個值,如果不是爲什麼要使用和輸入呢? –

+0

我不想使用輸入,因爲我已經在上面的代碼示例中的已評論代碼中說過它。我收錄的唯一原因是找出是否正在觀察變化。所以,從你的解釋我明白,如果我使用「輸入」,那麼它會監視變化,並有開銷。否則,如果我只是使用模板標記,那麼數據會在視圖中呈現一次,然後停止監視更改。我理解它嗎? –