Поскольку вы использовали здесь @
, для которого требуется значение из атрибута с директивой интерполяции {{}}
. И кажется, что сначала загружается директива, а затем оценивается значение vm.index
. Таким образом, изменения не происходят в текущем цикле дайджеста. Если вы хотите, чтобы они отражались, вам нужно запустить цикл дайджеста более безопасным способом, используя $timeout.
$timeout(function(){
vm.index = parseInt(vm.index, 10)
})
Вышеупомянутая вещь гарантирует, что значение преобразуется в десятичное значение. Добавление будет происходить по директиве html <h2>Item {{ vm.index + 1 }}</h2>
Рабочая демонстрация
Возможная причина
Согласно @dsfq и моему обсуждению, мы прошли угловой $compile
API и обнаружили, что это один вызов метода initializeDirectiveBindings
, который вызывается только тогда, когда мы используем controllerAs
в директиве с изолированной областью. В этой функции есть случаи переключения для различных привязок @
, =
и &
, поэтому, поскольку вы используете @
, это означает, что вызывается односторонняя привязка, следующая за кодом случая переключения.
Код
case '@':
if (!optional && !hasOwnProperty.call(attrs, attrName)) {
destination[scopeName] = attrs[attrName] = void 0;
}
attrs.$observe(attrName, function(value) {
if (isString(value)) {
destination[scopeName] = value;
}
});
attrs.$$observers[attrName].$$scope = scope;
if (isString(attrs[attrName])) {
// If the attribute has been provided then we trigger an interpolation to ensure
// the value is there for use in the link fn
destination[scopeName] = $interpolate(attrs[attrName])(scope);
}
break;
В приведенном выше коде вы можете ясно видеть, что там они разместили attrs.$observe
, который является одним из видов наблюдателя, который обычно используется, когда значение интерполировано, как в нашем случае это то же самое {{index}}
, это означает, что это $observe
оценивается при запуске цикла дайджеста, это почему вам нужно поставить $timeout
, сделав index
значением decimal
.
Причина, по которой ответ @dsfq работает, потому что он использует =
, обеспечивает двустороннюю привязку, код которой не помещает наблюдатель напрямую извлекать значение из изолированной области, вот код. Таким образом, без цикла дайджеста это значение обновляется.
person
Pankaj Parkar
schedule
23.06.2015
vm.index
не преобразуется из строки в число, что приводит к конкатенации строк при выполнении чего-то вроде{{ vm.index + 1 }}
. - person Raphael Rafatpanah   schedule 23.06.2015vm.index = ...
наvm.newIndex = ...
и обновив шаблон для использованияvm.newIndex + 1
. - person Raphael Rafatpanah   schedule 23.06.2015vm.index
не будет работать, сделав прямойparseInt
с контроллера - person Pankaj Parkar   schedule 24.06.2015@
на=
, но я отметил ваш ответ как правильный, потому что он очень хорошо отвечает на вопрос. Спасибо. - person Raphael Rafatpanah   schedule 24.06.2015