Eu tenho meu código da seguinte maneira:
one_time.js
var sample = angular.module('sample', []);
sample.controller('OneTimeController', function () {
this.name = 'John';
this.blah = 'sdflk';
});
index.html
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script type="text/javascript" src="one_time.js"></script>
</head>
<body ng-app="sample">
<div ng-controller="OneTimeController as test">
<p>Input something in the input box:</p>
<p>Name: <input type="text" ng-model="test.name" value="John"></p>
<p ng-bind="test.name"></p>
<p ng-bind="::test.name"></p>
<p ng-if="test.name && test.blah">testing</p> <!-- works perfectly-->
<p ng-if="::test.name && test.blah">testing with first expression as one time binded</p> <!-- works but the second property is not one time binded-->
<p ng-if="::test.name && ::test.blah">testing with one time bind</p><!-- doesn't work throws syntax error-->
</div>
</body>
</html>
Estou tentando mostrar uma tag <p>
com uma condição ng-if na qual quero que a propriedade name seja associada uma vez. Eu já sei que não vai mudar, então queria tentar uma ligação única no ng-if também. Funciona perfeitamente quando eu não uso a vinculação única ou quando uso apenas a vinculação única com a primeira expressão neste caso <p ng-if="::test.name && test.blah">testing with first expression as one time binded</p>
, no entanto, quando tento usar a vinculação única em mais de uma expressão juntamente com um operador de guarda, ele me lança um erro como um erro de sintaxe:
Error: [$parse:syntax] Syntax Error: Token ':' not a primary expression at column 14 of the expression [test.name && ::test.blah && ::test.blah] starting at [::test.blah && ::test.blah].
http://errors.angularjs.org/1.3.14/$parse/syntax?
Isso é um bug ou um erro de sintaxe genuíno? Estou usando o angularjs versão 1.3.14.
Eu acho que você deveria usar ()
para ligações no tempo com expressões ex .: <p ng-if="::(test.name && test.blah)">testing with first expression as one time binded</p>
Obrigado @piernik funciona (::test.name) && (::test.blah)
mas parece que o primeiro ::
ativa a ligação única. : +1:
a vinculação única (: :) se aplica a todas as expressões usadas no ng-if.
<p ng-if="::test.name && test.blah"> is same as <p ng-if="::(test.name && test.blah)">
Infelizmente, não podemos misturar a vinculação única com expressões de vinculação unilateral em uma única expressão em angular js.
Comentários muito úteis
Eu acho que você deveria usar
()
para ligações no tempo com expressões ex .:<p ng-if="::(test.name && test.blah)">testing with first expression as one time binded</p>