У меня проблема с AngularJS 1.1.5, при первой загрузке ввод не заполнен начальным значением, это нормально для 1.2.x и выше. Я ограничен этой версией, так как это решение для бэкэнда Umbraco 7.9.2.
Это пример использования директивы с $ parsers для проверки ввода на основе функции, определенной в контроллере. Подобные решения широко используются здесь при переполнении стека или здесь , чтобы избежать часов. Как заполнить начальное значение в этом сценарии?
HTML
<div ng-app="app">
<div ng-controller="TitleWidget">
<div class="help">
<label id="TitleLabel" ng-model="model.value.combinedtitle">{{model.value.combinedtitle}}</label>
</div>
<input type="text" ng-model="model.value.title" myfunction="change" name="title" id="title"
class="umb-editor umb-textstring textstring"
val-server="value"
ng-required="model.validation.mandatory"
ng-trim="false"/>
<span class="help-inline" val-msg-for="title" val-toggle-msg="valServer"></span>
<span class="help-inline" val-msg-for="title" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
<div class="help" ng-if="model.maxlength">
<strong>{{model.count}}</strong>
<span>characters left</span>
</div>
</div>
</div>
и контроллер
angular.module('app',[])
.controller('TitleWidget', function ($q, $scope, $rootScope, $http,
$cacheFactory) {
$scope.init = function () {
if (!$scope.model) {
$scope.model = {};
}
if (!$scope.model.value) {
$scope.model.value = {};
$scope.model.value.combinedtitle = [];
$scope.model.value.title = [];
}
};
$scope.init();
$scope.model.value.title= "title";
$scope.model.value.combinedtitle= "combinedtitle";
$scope.model.count= 0;
$scope.change = function (value, text) {
$scope.model.value.combinedtitle = value + " combined " + text;
$scope.model.count= 100 - $scope.model.value.combinedtitle.length;
return true;
};
}).directive('myfunction', function () {
return {
scope: {
myfunction: '&myfunction'
},
require: 'ngModel',
link: function ($scope, element, attrs, ctrl) {
ctrl.$parsers.push(function (view) {
var result = $scope.myfunction()(view, "from directive");
if (!result) {
ctrl.$setValidity('maxlen', false);
} else {
ctrl.$setValidity('maxlen', true);
}
return view;
});
}
};
});
jsfiddle демонстрирует проблему здесь