AngularJS - Bir ng-modeli kullanıldığında, giriş metin kutusundaki değer özelliği yok sayılıyor mu?


219

Aşağıdaki "bob" gibi bir şeye basit bir giriş metin kutusu değeri ayarladıysam AngularJS kullanarak. ng-modelÖzellik eklenirse değer görüntülenmez .

    <input type="text"
           id="rootFolder"
           ng-model="rootFolders"
           disabled="disabled"
           value="Bob"
           size="40"/>

Herkes bu girdi bir şey varsayılan ve tutmak için basit bir çalışma biliyor musunuz ng-model? ng-bindVarsayılan değeri olan bir kullanmaya çalıştım ama bu da işe yaramıyor gibi görünüyor.

Yanıtlar:


223

İstenilen davranış budur, modeli görünümde değil, denetleyicide tanımlamanız gerekir.

<div ng-controller="Main">
  <input type="text" ng-model="rootFolders">
</div>


function Main($scope) {
  $scope.rootFolders = 'bob';
}

11
Teşekkürler. Ancak bu durumda, model denetleyicide ayarlanır. Açısal belgelerde her zaman aynıdır, veriler denetleyicide ayarlanır. Ancak denetleyicim bir JS dosyasında. "Düzenle" formundayken nasıl yapılır? Varsayılan form verileri denetleyiciye "açısal yolla" nasıl aktarılır?
ByScripts

8
Bu benim için işe yaramaz, ancak Mark Rajcok tarafından gösterilen ek öznitelik ng-init ekleme (ng-init = "rootFolders = 'Bob'") iyi çalışıyor.
Kaizar Laxmidhar

Ve aşağıdaki gibi bir girdi alanım varsa varsayılan değeri nasıl ayarlarım: <input type = "number" ng-model = "newTransaction [$ index] [user.email]" />?
Şiş

188

Vojta "Açısal yolu" tanımladı, ancak bu işi gerçekten yapmanız gerekiyorsa, @urbanek yakın zamanda ng-init kullanarak bir geçici çözüm gönderdi:

<input type="text" ng-model="rootFolders" ng-init="rootFolders='Bob'" value="Bob">

https://groups.google.com/d/msg/angular/Hn3eztNHFXw/wk3HyOl9fhcJ


33
'Value = "Bob"' bölümüne ihtiyacınız olmayabilir.
Mark Rajcok

2
+1 ancak, Bağlantılı tartışmadaki gönderilerden birinde belirtildiği gibi, bundan kaçınılmalıdır (mantıksal olarak daha az doğrudur ve testi zorlaştırır).
0xc0de

1
V1.2'de de bir model değeri kullanıyorsanız bu yöntem işe yarar. <... ng-init = "rootFolders = someModelAttribute" ...>
dmcqu314

@ MarkRajcok, Stack Overflow'da çok fazla harika AngularJS kaydınız var! Görüşlerinizi SO topluluğuyla paylaşmaya ayırdığınız her zaman için teşekkür ederiz. Bizi kurtardığınız tüm saatleri içtenlikle takdir ettiğimizi söylediğimde, rahatlamış birçok geliştirici için konuştuğuma eminim!
Jeremy Moritz

1
Mark'ın cevabını gerçekten takdir ediyorum, bu da sorunumu çözdü. value="Bob"Giriş etiketinde bir parçaya ihtiyacımız olmadığını onaylıyorum .
Devner

68

Giriş yönergesini geçersiz kılmak işi yapıyor gibi görünüyor. Dan Hunsaker'in kodunda bazı küçük değişiklikler yaptım :

  • Kullanmaya çalışmadan önce ngModel için bir kontrol eklendi $parse().assign()Bir ngModel özelliği olmayan alanlarda .
  • assign()Fonksiyon parametresi sırası düzeltildi .
app.directive('input', function ($parse) {
  return {
    restrict: 'E',
    require: '?ngModel',
    link: function (scope, element, attrs) {
      if (attrs.ngModel && attrs.value) {
        $parse(attrs.ngModel).assign(scope, attrs.value);
      }
    }
  };
});

Bulduğum en iyi cevap bu! ... sorunumu zarif bir şekilde çözüyor. Gizli bir giriş (sunucuda oluşturulan bir Symfony form belirteci) bir değer yakalamak zorunda kaldı.
PachinSV

Bu sadece akıllı değil aynı zamanda en iyi çözümdür. Benim durumumda, bir PHP formu olduğundan denetleyicide ng-modelinin varsayılan değerini ayarlayamıyorum, sunucu tarafı doğrulaması başarısız olursa, form yenilenir ve ng modelinde ne varsa giriş değeri silinerek kaybolur çok.
Luis Elizondo

2
HTML formunuzun temel bir sürümünün JavaScript olmadan da çalışmasını istiyorsanız, bu en iyi çözümdür.
Darren

Açısal kendi içinde gerçekten varsayılan olmayan yapılandırılabilir bir seçenek olması gereken mükemmel çözüm.
Gracie

Çözümünüz için teşekkürler. Sayı girişi sorununu nasıl çözersiniz? Bir hata atar docs.angularjs.org/error/ngModel/numfmt?p0=20.12
mate.gwozdz

21

Açısal yol

Bunu yapmanın doğru Açısal yolu, tek bir sayfa uygulaması, AJAX form şablonuna yazmak ve sonra modelden dinamik olarak doldurmaktır. Model varsayılan olarak formdan doldurulmaz, çünkü model tek hakikat kaynağıdır. Bunun yerine Angular diğer yöne gidecek ve formu modelden doldurmaya çalışacaktır.

Ancak, baştan başlamak için zamanınız yoksa

Yazılı bir uygulamanız varsa, bu oldukça ağır mimari değişiklikler içerebilir. Angular'ı tek bir sayfanın tamamını sıfırdan oluşturmak yerine mevcut bir formu geliştirmek için Angular'ı kullanmaya çalışıyorsanız, değeri bir yönerge kullanarak formdan alabilir ve bağlantı zamanında kapsamda saklayabilirsiniz. Açısal, kapsamdaki değeri forma geri bağlar ve senkronize tutar.

Direktif kullanma

Değeri formdan çekmek ve geçerli kapsama yüklemek için nispeten basit bir yönerge kullanabilirsiniz. Burada bir initFromForm yönergesi tanımladım.

var myApp = angular.module("myApp", ['initFromForm']);

angular.module('initFromForm', [])
  .directive("initFromForm", function ($parse) {
    return {
      link: function (scope, element, attrs) {
        var attr = attrs.initFromForm || attrs.ngModel || element.attrs('name'),
        val = attrs.value;
        if (attrs.type === "number") {val = parseInt(val)}
        $parse(attr).assign(scope, val);
      }
    };
  });

Bir model adı almak için birkaç yedek tanımladığımı görebilirsiniz. Bu yönergeyi ngModel yönergesi ile birlikte kullanabilir veya isterseniz $ scope dışında bir şeye bağlayabilirsiniz.

Şöyle kullanın:

<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}

Bunun textareas ile çalışacağını ve açılır menüleri seçeceğini unutmayın.

<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}

İşte burada açıklananlara benzer bir çözüm uygulayan paketlenmiş bir modül github.com/platanus/angular-keep-values
Agustin

1
Harika bir çözüm, ancak sadece ile çalışacak input="text". Eğer bir varsa numbero atacağım Model tipi değil number docs.angularjs.org/error/ngModel/numfmt?p0=333
smoksnes

2
Numaraları desteklemek için if (attrs.type === "number") val = parseInt(val);
smoksnes

@smoksnes - kesinlikle haklısın. Cevabı güncelledim :)
superluminary

7

Güncelleme: Orijinal yanıtım, denetleyicinin HTML lehine Açısal kuralları ihlal eden DOM bilinçli kod içermesini içeriyordu. @dmackerman cevabımla ilgili bir yorumda direktiflerden bahsetti ve şimdiye kadar bunu tamamen özledim. Bu girişle, Açısal veya HTML kurallarını bozmadan bunu yapmanın doğru yolu şudur :


Her ikisini de almanın bir yolu vardır - öğenin değerini alın ve bunu bir yönergede modeli güncellemek için kullanın:

<div ng-controller="Main">
    <input type="text" id="rootFolder" ng-model="rootFolders" disabled="disabled" value="Bob" size="40" />
</div>

ve sonra:

app.directive('input', ['$parse', function ($parse) {
    return {
        restrict: 'E',
        require: '?ngModel',
        link: function (scope, element, attrs) {
            if(attrs.value) {
                $parse(attrs.ngModel).assign(scope, attrs.value);
            }
        }
    };
}]);

Elbette yukarıdaki yönergeyi value, modeli değerine ayarlamadan önce öznitelikle daha fazlasını yapmak için $parse(attrs.value, scope), valueözniteliği Açısal ifade olarak ele almak için kullanma da dahil olmak üzere değiştirebilirsiniz (bunun için muhtemelen farklı bir [özel] öznitelik kullanacağım) böylece standart HTML özellikleri tutarlı olarak sabit olarak değerlendirilir).

Ayrıca, ilgi çekici olabilecek ng-modeline uygun verilerin sunulması konusunda da benzer bir soru vardır .


Denetleyicilerinizde herhangi bir DOM manipülasyonu / keşfi yapmamalısınız. Bunun yerine bir yönerge kullanmalıdır.
dmackerman

2
Cevabımdaki bu dezavantajdan açıkça bahsettim. Sen olmamalı , ama sen can . Her şey Angular veya HTML kurallarına uymanın daha önemli olup olmadığına bağlıdır. Çünkü Açısal HTML'yi bozar.
Dan Hunsaker

3
Oh, ben bir kukla. Bir yönerge kullanma konusunda biraz özledim. Yanıt buna göre güncellendi. Sana pislik olduğun için en içten özür dilerim @dmackerman.
Dan Hunsaker

Direktif için teşekkürler! Üzerinde çalıştığım bir proje için bazı içerik sunucusu tarafı oluşturduğum ve sonra istemcide modelim olarak kullanmam gereken fikirler verdi.
ggalmazor

Yardımcı olduğuma sevindim. Tabii ki, genel olarak konuşursak, sunucu tarafı içeriğinizi JSON olarak oluşturmak ve uygulamanızın buna göre modeli manipüle etmesini istersiniz, ancak bazen başka seçeneklere sahip olmak yararlıdır ve bu sadece bir tanesidir.
Dan Hunsaker

7

AngularJs ngModel yönergesini kullanıyorsanız, valueöznitelik değerinin ngModel alanına bağlanmadığını unutmayın. Bunu kendiniz başlatmanız ve bunu yapmanın en iyi yolu,

<input type="text"
       id="rootFolder"
       ng-init="rootFolders = 'Bob'"
       ng-model="rootFolders"
       disabled="disabled"
       value="Bob"
       size="40"/>

Denetleyici yerine yönergede / biçimlendirmede başlatmak garip geliyor.
random_user_name

5

Bu, önceki cevaplarda küçük bir değişikliktir ...

$ Ayrışmasına gerek yok

angular.directive('input', [function () {
  'use strict';

  var directiveDefinitionObject = {
    restrict: 'E',
    require: '?ngModel',
    link: function postLink(scope, iElement, iAttrs, ngModelController) {
      if (iAttrs.value && ngModelController) {
        ngModelController.$setViewValue(iAttrs.value);
      }
    }
  };

  return directiveDefinitionObject;
}]);

ngModelController olduğunu unutmayın. $ setViewValue, model durumunu kirli ve bozulmamış olarak false olarak değiştirir ve bu da bir süre acı çekebilecek form durumunu etkileyecektir.
Atul Chaudhary

2

Merhaba modeli başlatmak ile aşağıdaki yöntemleri deneyebilirsiniz.

Burada metin kutusunun ng-modelini iki şekilde başlatabilirsiniz

- ng-init kullanımı ile

- js'de $ scope kullanımı ile

<!doctype html>
 <html >
 <head>
        <title>Angular js initalize with ng-init and scope</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
</head>
<body ng-app="app" >
    <h3>Initialize value with ng-init</h3>
    <!-- Initlialize model values with ng-init -->
    <div ng-init="user={fullname:'Bhaskar Bhatt',email:'bhatt.bhaskar88@gmail.com',address:'Ahmedabad'};">
        Name : <input type="text" ng-model="user.fullname" /><br/>
        Email : <input type="text" ng-model="user.email" /><br/>
        Address:<input type="text" ng-model="user.address" /><br/>

    </div>  
    <!-- initialize with js controller scope -->
    <h3>Initialize with js controller</h3>

    <div  ng-controller="alpha">
        Age:<input type="text" name="age" ng-model="user.age" /><br/>
        Experience : <input type="text" name="experience" ng-model="user.exp" /><br/>
        Skills : <input type="text" name="skills" ng-model="user.skills" /><br/>
    </div>  

</body> 
<script type="text/javascript">
        angular.module("app",[])
        .controller("alpha",function($scope){
            $scope.user={};
            $scope.user.age=27;
            $scope.user.exp="4+ years";
            $scope.user.skills="Php,javascript,Jquery,Ajax,Mysql";
        });

     </script>
 </html>                

0

Sorun, ng-modelini, ng-değerini / değerini ayarlamak istediğiniz yere üst öğeye ayarlamanız gerektiğidir. Angular tarafından belirtildiği gibi:

Temel olarak giriş [radyo] ve seçenek öğelerinde kullanılır, böylece öğe seçildiğinde, o öğenin ngModel'i (veya seçili üst öğe) bağlı değere ayarlanır.

Örn: Bu yürütülen bir koddur:

<div class="col-xs-12 select-checkbox" >
<label style="width: 18em;" ng-model="vm.settingsObj.MarketPeers">
  <input name="radioClick" type="radio"  ng-click="vm.setPeerGrp('market');" 
         ng-value="vm.settingsObj.MarketPeers" 
         style="position:absolute;margin-left: 9px;">
  <div style="margin-left: 35px;color: #717171e8;border-bottom: 0.5px solid #e2e2e2;padding-bottom: 2%;">Hello World</div>
</label>
</div>

Not: Yukarıdaki durumda ben ng-model ve değeri JSON yanıtı alreday sadece JS nesnesi "MarketPeers" olarak başka bir özellik ekliyorum. Bu nedenle model ve değer ihtiyaca göre değişebilir, ancak bence bu işlem hem ng-model hem de değere sahip olmak için aynı öğeye sahip olmamakta yardımcı olacaktır.


0

Benzer bir sorunum vardı. value="something"Göstermek ve düzenlemek için kullanamadım . Ben <input>ilan modeli ile birlikte benim içinde aşağıdaki komutu kullanmak zorunda kaldı .

[(ngModel)]=userDataToPass.pinCode

Nesnede veri listesi var ve userDataToPassgörüntülemek ve düzenlemek için gereken öğedir pinCode.

Aynı şekilde, bu YouTube videosundan bahsettim


Bunun için OP, AngularJS kullanıyor, YT video referansınız Angular 4 kullanıyor.
Chris22
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.