亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

angular.js - angularjs scope.$watch取不到input變化的值

瀏覽:142日期:2024-10-14 11:55:13

問題描述

我想用angularjs和my97datepicker做一個東西,寫了一個direcitve,在點擊選擇完時間之后,把值同步到scope上面。描述的有點亂,看下主要代碼:

javascriptvar datepicker=angular.module('datepicker',[]);datepicker.controller('datepickerCtrl',function($scope){ $scope.date='2014-10-14';});datepicker.directive('datePicker',function(){ return {restrict:'A',link:function(scope,element,attr){ element.bind('click',function(){window.WdatePicker(); }); //問題在這里,無法取到變化的值,而且加上這個,連初始的值都無法顯示出來。 scope.$watch(attr.value,function(newVal){scope.date=newVal; });} };});

在線地址:http://jsfiddle.sinaapp.com/4zz6nvadg/embedded。初學(xué)angularjs,每次寫directive都是卡在$watch這里。

問題解答

回答1:

我不知道怎么解決,因為你用的那個插件我沒有用過,現(xiàn)在也沒時間去研究它。不過我可以告訴你問題出在哪里,你試著自己找找解決方案吧。先看截圖:

angular.js - angularjs scope.$watch取不到input變化的值

先注釋了 $watch 相關(guān)的代碼,以確保插件正確執(zhí)行注意下面:2014-10-14 出現(xiàn)在 DOM 的哪里了嗎?在 $watch 部分你監(jiān)視的是 attr.value,然而根據(jù)截圖可以發(fā)現(xiàn)插件設(shè)定的日期根本就不是保存在 input[value] 這里,無論如何 input[value] 都是空值因此,$watch 所做的僅僅是讀取一個不存在的值,并且覆蓋了 model,這就是為什么加上 $watch 部分之后,連 model 都失效的緣故。

知道原因之后,解決辦法就簡單了,要么讓插件把你想要的值寫到 input[value] 去,要么反過來,找到正確的地方去取值去 $watch,具體辦法自己去查詢插件的文檔或源碼吧。

吃了晚飯,幫你看一下插件的源代碼,實際上人家提供了幾個事件回調(diào)函數(shù),而且你不必非用 $watch 的,代碼如下:

var datepicker=angular.module('datepicker',[]);datepicker.controller('datepickerCtrl',function($scope){ $scope.date='2014-10-14';});datepicker.directive('datePicker',function(){ return { restrict:'A', link:function(scope, element, attr){ element.bind('click', function () {window.WdatePicker({ onpicked: function () { scope.$apply(scope.date = this.value); }}); }); } };});

Demo: http://jsfiddle.sinaapp.com/4zz6n9usy

想用 $watch 也可以,這樣寫:

var datepicker=angular.module('datepicker',[]);datepicker.controller('datepickerCtrl',function($scope){ $scope.date='2014-10-14';});datepicker.directive('datePicker',function(){ return { restrict:'A', link:function(scope, element, attr){ element.bind('click', function () {window.WdatePicker({ onpicked: function () { scope.$digest(); }}); }); scope.$watch(function () { return element[0].value },function (newValue) { scope.date = newValue; } ); } };});

Demo: http://jsfiddle.sinaapp.com/4zz6n9t9q

注意,這里第一個參數(shù)不能是直接 element[0].value,因為這個值是一個 primitive string,而不是 angular 封裝過的對象,所以要用一個 getter 函數(shù)顯式的去獲取,否則你拿不到的。

而且這里還必須得依賴插件的回調(diào)函數(shù)做一下 scope.$digest(),否則 scope.date 不會自動更新。由此可見,還是第一個例子更簡單,性能也更好。

回答2:

不知道為何要這么用,這里你需要明確一個概念,屬性和 scope 是不同的,如果要綁定屬性值到 scope 中,需要在 directive 中去做 scope 的聲明,有以下三種方式:

=attr 雙向@attr 單向&attr 函數(shù)

按照你的思路,可能是下面的方式:

scope: { value: ’=value’}

但即使是做了綁定,還要明白這個元素的 value 的值變更并不是 Angular 默認(rèn)會做監(jiān)控的,這個綁定只是說要去綁定這個屬性值對應(yīng)的變量,當(dāng)然無法 watch 到 value 的變更。其實用 ng-model 和 ng-change 足夠了。

最終可能是這樣:

<input ng-model='date' date-picker />回答3:

試試把$scope傳進(jìn)來!$watch是在$scope基礎(chǔ)上的

回答4:

沒找到link的詳細(xì)文檔,不能確定attr的具體使用方法,不過覺得你可以試試$watch一下element的value。

至于樓上2位,在directive里scope就是它的$scope,attr是link里的一個參數(shù),不需要另外定義。

回答5:

樓主你好,請問這個問題最后如何解決,我現(xiàn)在是ng-model取到的值還是undefined

相關(guān)文章:
主站蜘蛛池模板: 黄色录像日本 | 免费黄网在线观看 | 成年日韩免费大片黄在线观看 | 精品一区二区三区自拍图片区 | 成年人在线免费观看视频网站 | 国产大片91精品免费观看不卡 | 成人五月网 | 中国一级一级全黄 | 久久精品国产999大香线焦 | 欧美精品人爱c欧美精品 | 黄色成人在线网站 | 欧洲免费极品videos | 五月婷婷狠狠干 | 在线欧美日韩精品一区二区 | 中文字幕日韩一区二区 | 6080yy 久久 亚洲 日本 | 免费区欧美一级毛片 | 全免费午夜一级毛片一级毛 | 成人黄激情免费视频 | 黄址在线观看 | 97精品国产高清自在线看超 | 麻豆精品a在线观看 | 色视频一区二区三区 | 男女啪啪免费观看网站 | 日本大片在线观看免费视频 | 亚洲品质自拍视频 | 品爱网在线观看视频免费视频 | 黄色小视频在线看 | 久久精品网站免费观看 | 黄色网址日本 | 色成人在线 | 国产精品美女自拍 | 成人性色生活片免费看爆迷你毛片 | 国语自产免费精品视频在 | 一级做a免费视频观看网站 一级做a爰毛片 | 综合免费视频 | 欧美洲精品亚洲精品中文字幕 | 欧美一级片网址 | 最刺激黄a大片免费观看 | 黄色一级一级 | 欧美日本一区二区三区生 |