2013-11-14 11 views
15

"Video For Everybody"ジェネレータを使用してアプリ内のメディアプレーヤーを統合しています。ブラウザがHTML5 videoaudioをサポートしていない場合、プレーヤーはparamの属性を持つobject要素をビデオとプレースホルダ(画像)ソースで構築する必要があります。むしろ、その後AngularJS:非標準属性でのng-srcの動作?

私は時間内に解決されていない表現の古典問題に遭遇予想したように、私のブラウザはmy.media.com/{{video.src}}に要求を送信my.media.com/somevideo.mp4

は、残念ながら、私は同じに直面しているいくつかの属性(poster, flashvars, placeholder数名にする)があります問題。 ng-srcまたはng-hrefディレクティブと同じ動作を作成するにはどうすればよいですか?私は関連するソースコードを探してみましたが、見つかりませんでした。ここでは、ビルドインディレクティブのソースは公式APIドキュメントに簡単に作られて見つける問題のHTMLを展示スニペット、

<video controls="controls" poster="{{mediaModel.mediaFile2}}" width="300" height="150"> 
<source ng-src="{{mediaModel.mediaFile}}" type="{{mediaModel.contentType}}" /> 
<object type="application/x-shockwave-flash" data="http://player.longtailvideo.com/player.swf" width="300" height="150"> 
    <param name="movie" value="http://player.longtailvideo.com/player.swf" /> 
    <param name="allowFullScreen" value="true" /> 
    <param name="wmode" value="transparent" /> 
    <param name="flashVars" value="{{'controllerbar=over&amp;image=' + media.mediaFile2 + '&amp;file=' + mediaModel.mediaFile}}" /> 
    <img ng-src="{{mediaModel.mediaFile2}}" width="300" height="150" title="{{mediaModel.uploadedTime}}" /> 
</object> 

+0

動作しないアプローチをいくつか共有できますか? –

+0

この時点で、私は多かれ少なかれ暗闇の中で、カスタム属性を適用することが可能かどうかを判断しようとしているので、私は現時点でのコードはどれも建設的なものにはならないと思います質問。私は何かを感じるとすぐに私はもちろん更新されます。 –

答えて

8

です。この場合、ngSrcのドキュメントに移動し、ページの上部に「このドキュメントを改善する」と「ソースを表示」の2つのボタンが表示され、「ソースを表示」をクリックすると、自動的に正しいソースファイルに移動しますディレクティブが定義されています。これはすべてのビルドイン指令全体で機能し、とても便利です!私はそれが99の優先順位を持つディレクティブは後を実行することを意味し、次にコメントをもとに、興味深いことに、全く複雑で見えない、決定的なラインがpriority: 99であるように思わngSrc、ためのコードを貼り付けています以下は

属性が補間されています。

// ng-src, ng-srcset, ng-href are interpolated 
forEach(['src', 'srcset', 'href'], function(attrName) { 
    var normalized = directiveNormalize('ng-' + attrName); 
    ngAttributeAliasDirectives[normalized] = function() { 
    return { 
     priority: 99, // it needs to run after the attributes are interpolated 
     link: function(scope, element, attr) { 
     attr.$observe(normalized, function(value) { 
      if (!value) 
      return; 

      attr.$set(attrName, value); 

      // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist 
      // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need 
      // to set the property as well to achieve the desired effect. 
      // we use attr[attrName] value since $set can sanitize the url. 
      if (msie) element.prop(attrName, attr[attrName]); 
     }); 
     } 
    }; 
    }; 
}); 

上記を考慮すると、独自の指令を実装するのは簡単です。

+0

すごく、ありがとうございました。私はAngularのドキュメントで非常に多くの時間を費やしてきたと信じてはいけません。その単純な、しかし非常に実用的な機能を見落としました。ちょうどFYI:私は少し多くの答えがポップアップのために少しの間恩恵を受け入れる/報酬を与えることを保留にします。 –

+0

@KGChristensen NP嬉しいことに助けてくれました。 – Beyers

1

したがって、最も一般的で、保守可能で、構成可能で再利用可能なソリューションは、それを処理するカスタムディレクティブを作成することです。

この-->PLNKR<--を見ると、そこには実質的にすべてが必要です。あなたはそれを少し弱めるだけです。

どのように動作するのですか:設定オブジェクトを渡す指示(追加の属性を作成するだけのオブジェクトが必要な場合)。この要素はreadyかnotの2つの状態にあります。 は、すべての成分が収集されたかどうかを示しています。もしngSwitchがvideoPlayerテンプレートをロードし、そこにすべての情報があるので、不要なリクエストは送信されません。

+0

固定のタイムアウトを設定しても、ユーザーフレンドリーではありません。私は式の解決を監視するために$ observeを使用してngSrcディレクティブの独自の実装を作成することができました。 –

+0

@KGChristensenおそらくコードを理解できませんでした。 '$ timeout'を使うことは、このアプローチが**働いていることを実証することに過ぎず、コントローラ内で使用されており、指令自体では使用されていませんでした。ディレクティブは、スコープが入力されるのを待って、すべてのデータが正しく設定されているかどうかをチェックし、テンプレートをロードする場合のみチェックします。スコープをどのように埋めるのかはまったく関係ありません**: '$ timeout'を使いました。コントローラが初期化されたときに関連するすべての情報がすでにある場合、その指示も同様に機能します。 –

+0

ああ、申し訳ありませんが、今は別の視線がありました。このアプローチが有効であることはわかりますが、データが準備される前にテンプレートを含めないと、(特にngSrcアプローチに比べて)ディレクティブアプローチの強みを発揮する気がしません。 –

47

ng-attr-poster、またはより一般的にはng-attr-whateverを使用できるようになりました。

+1

これは私のために働いた!ありがとうございました –

1

videoタグのposter属性で同様の問題が発生しました。属性srcを持つ要素にng-cloakを適用すると、クロークが削除されて表示されるまで何も読み込まれません。

+0

ニース、更新のおかげで。 –

関連する問題